Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
U
user
Overview
Overview
Details
Activity
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
hooloo
mp
user
Commits
9a2d8da5
Commit
9a2d8da5
authored
Feb 24, 2023
by
songbingqi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
完成部分开发
parent
fd48b2da
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
1579 additions
and
147 deletions
+1579
-147
components/AreaPicker/index.vue
+1
-1
components/OrderQrCode/index.vue
+154
-11
components/menuAssembly/index.vue
+29
-19
components/shopCar/shopCar.vue
+3
-3
menuSubPackage/pages/areaSelect/areaSelect.vue
+19
-2
menuSubPackage/pages/goodsDetail/goodsDetail.vue
+16
-13
orderSubPackage/pages/orderInfo/index.vue
+5
-11
pages/menu/menu.vue
+213
-86
request/menu/index.js
+15
-0
request/user/index.js
+1
-1
static/imgs/location_icon.png
+0
-0
static/js/qqmap-wx-jssdk.js
+1123
-0
No files found.
components/AreaPicker/index.vue
View file @
9a2d8da5
...
...
@@ -4,6 +4,7 @@
@
cancel=
"show = false"
:show=
"show"
:immediateChange=
"true"
mode=
"region"
ref=
"uPicker"
:columns=
"columns"
@
confirm=
"confirm"
...
...
@@ -36,7 +37,6 @@ export default {
showArea
()
{
uni
.
getSetting
({
success
:
(
res
)
=>
{
// 已经授权位置不获取默认店铺
if
(
res
.
authSetting
[
'scope.userLocation'
])
{
User
.
getLocation
((
state
,
params
)
=>
{
console
.
log
(
"showArea, state:"
+
state
+
", params:"
+
JSON
.
stringify
(
params
));
...
...
components/OrderQrCode/index.vue
View file @
9a2d8da5
...
...
@@ -32,13 +32,44 @@
<div
class=
"close_icon"
@
click=
"close"
>
<u-icon
name=
"close-circle"
color=
"#666666"
size=
"28"
:top=
"-3"
></u-icon>
</div>
<div
class=
"code"
>
取单码
{{
orderInfo
.
orderNum
}}
</div>
<view
class=
"code"
>
<view
class=
"code_label"
>
取单号:
</view>
<view
class=
"code_content"
>
{{
orderInfo
.
orderNum
}}
</view>
</view>
<view
class=
"statusTip"
>
<view
class=
"tip_box"
>
<view
class=
"tip"
>
<view
class=
"icon"
>
<image
v-if=
"[1].indexOf(Number(orderInfo.state))!=-1"
mode=
"aspectFit"
:src=
"'/static/imgs/daizhizuo_action.png'"
/>
<image
v-else
mode=
"aspectFit"
:src=
"'/static/imgs/daizhizuo.png'"
/>
</view>
<view
:class=
"[1].indexOf(Number(orderInfo.state))!=-1?'tip_titile_action':'tip_tittle'"
>
1待制作
</view>
</view>
<view
class=
"tip"
>
<view
class=
"icon"
>
<image
v-if=
"[2, 3].indexOf(Number(orderInfo.state))!=-1"
mode=
"aspectFit"
:src=
"'/static/imgs/zhizuozhong_action.png'"
/>
<image
v-else
mode=
"aspectFit"
:src=
"'/static/imgs/zhizuozhong.png'"
/>
</view>
<view
:class=
"[2, 3].indexOf(Number(orderInfo.state))!=-1?'tip_titile_action':'tip_tittle'"
>
2制作中
</view>
</view>
<view
class=
"tip"
>
<view
class=
"icon"
>
<image
v-if=
"[4, 5].indexOf(Number(orderInfo.state))!=-1"
mode=
"aspectFit"
:src=
"'/static/imgs/wancheng_action.png'"
/>
<image
v-else
mode=
"aspectFit"
:src=
"'/static/imgs/wancheng.png'"
/>
</view>
<view
:class=
"[4, 5].indexOf(Number(orderInfo.state))!=-1?'tip_titile_action':'tip_tittle'"
>
3完成
</view>
</view>
</view>
</view>
<!--
<div
class=
"code"
>
取单码
{{
orderInfo
.
orderNum
}}
</div>
-->
<div
class=
"qr_code_readly"
>
<image
mode=
"scaleToFill"
:src=
"orderInfo.pickCode"
class=
"qr"
></image>
</div>
<div
class=
"ercodeTip"
>
制作完成后,扫描此二维码取杯。
</div>
<!--
<view
class=
"status_text"
v-if=
"showMask"
>
——制作完成后才能扫哦——
</view>
-->
<div
class=
"flow_describe"
>
<view
class=
"titleBox"
>
<
!--
<
view
class=
"titleBox"
>
<view
class=
"qrcodeTitle"
>
<view
class=
"title"
>
扫码流程
</view>
<view
class=
"icon"
>
...
...
@@ -51,11 +82,21 @@
<image
class=
"arrow"
:style=
"
{'height':'18rpx','width':'10rpx'}" :src="'../../static/imgs/jiantouhui.png'" />
</view>
</view>
</view>
</view>
-->
<image
:mode=
"'aspectFit'"
class=
"flow_img"
:src=
"'/static/imgs/saomaliucheng.png'"
></image>
</div>
<div
class=
"takeCupTip"
>
<div
class=
"text"
@
click=
"goShow()"
>
<view>
查看实景取杯演示
</view>
<image
class=
"arrow"
:style=
"
{ height: '18rpx', width: '10rpx' }"
:src="'/static/imgs/jiantouhui.png'"
/>
</div>
<!--
<div
class=
"btn"
@
click=
"refundInfo"
v-if=
"checkStatus(orderInfo.state, [12, 13, 14, 15])"
>
退款
</div>
-->
</div>
</div>
<div
class=
"flow_describe_tips"
>
<view
class=
"title"
>
注意事项
</view>
...
...
@@ -97,7 +138,6 @@ export default {
watch
:{
'show'
:{
handler
(
val
)
{
console
.
log
(
val
,
'wywy'
)
if
(
!
val
)
{
this
.
cleanTimeout
()
}
...
...
@@ -171,7 +211,7 @@ export default {
this
.
timer
=
setTimeout
(()
=>
{
this
.
getOrderInfo
()
clearTimeout
(
this
.
timer
)
},
2
000
);
},
5
000
);
}
this
.
orderInfo
=
{...
data
.
data
};
}
else
{
...
...
@@ -228,6 +268,108 @@ export default {
</
script
>
<
style
lang=
"scss"
scoped
>
.takeCupTip
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
padding
:
0
rpx
32
rpx
;
.text
{
font-size
:
28
rpx
;
font-family
:
PingFangSC-Regular
,
PingFang
SC
;
font-weight
:
400
;
color
:
#999999
;
display
:
flex
;
align-items
:
center
;
image
{
margin-left
:
10
rpx
;
}
}
.btn
{
border
:
1
rpx
solid
gray
;
border-radius
:
5
rpx
;
text-align
:
center
;
background
:
rgb
(
255
,
255
,
255
);
color
:
black
;
font-size
:
27
rpx
;
letter-spacing
:
5
rpx
;
line-height
:
64
rpx
;
width
:
180
rpx
;
}
}
.ercodeTip
{
margin
:
0
rpx
0
rpx
;
text-align
:
center
;
font-weight
:
bolder
;
font-size
:
30
rpx
;
}
.code
{
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
font-family
:
Futura
Medium
,
Arial
,
sans-serif
;
.code_label
{
margin-right
:
10
rpx
;
font-weight
:
900
;
font-size
:
45
rpx
;
color
:
#343434
;
}
.code_content
{
font-size
:
45
rpx
;
font-weight
:
800
;
letter-spacing
:
2
rpx
;
color
:
#0012ff
;
}
}
.statusTip
{
margin
:
30
rpx
0px
;
//
text-align
:
center
;
height
:
100
rpx
;
.tip_box
{
width
:
450
rpx
;
margin
:
0
auto
;
height
:
100%
;
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
.tip
{
height
:
100%
;
width
:
100
rpx
;
.icon
{
width
:
60
rpx
;
height
:
60
rpx
;
margin
:
5
rpx
auto
;
image
{
width
:
100%
;
height
:
100%
;
transform
:
scale
(
1.4
)
rotate
(
0deg
)
}
}
.tip_tittle
{
margin-top
:
10
rpx
;
text-align
:
center
;
font-size
:
25
rpx
;
color
:
rgb
(
151
,
151
,
151
);
}
.tip_titile_action
{
margin-top
:
10
rpx
;
text-align
:
center
;
font-weight
:
bolder
;
font-size
:
25
rpx
;
}
}
}
}
.pages
{
padding-top
:
1
rpx
;
padding-bottom
:
30
rpx
;
...
...
@@ -288,7 +430,7 @@ export default {
margin
:
32
rpx
;
position
:
relative
;
padding-top
:
54
rpx
;
padding-bottom
:
6
2
rpx
;
padding-bottom
:
3
2
rpx
;
.status_text
{
font-size
:
28
rpx
;
font-family
:
PingFangSC-Medium
,
PingFang
SC
;
...
...
@@ -305,10 +447,10 @@ export default {
}
.qr_code_readly
{
margin
:
20
rpx
auto
;
margin-top
:
38
rpx
;
margin-bottom
:
66
rpx
;
width
:
4
74.6
rpx
;
height
:
4
76
rpx
;
margin-top
:
50
rpx
;
margin-bottom
:
30
rpx
;
width
:
4
50
rpx
;
height
:
4
50
rpx
;
.qr
{
width
:
100%
;
height
:
100%
;
...
...
@@ -344,6 +486,7 @@ export default {
width
:
100%
;
height
:
300
rpx
;
padding-left
:
31
rpx
;
margin-top
:
20
rpx
;
.titleBox
{
display
:
flex
;
...
...
components/menuAssembly/index.vue
View file @
9a2d8da5
...
...
@@ -71,8 +71,8 @@
</view>
<view
@
click=
"cart(item, category)"
class=
"info"
>
<view
class=
"goods-name"
>
{{
item
.
name
}}
</view>
<view
class=
"tags"
v-if=
"item.tags"
>
<view
class=
"tag-item"
v-for=
"tag in item.tags"
:key=
"tag
"
>
{{
<view
class=
"tags"
v-if=
"item.tags
||item.recommendTag
"
>
<view
v-for=
"(tag,index) in getTags(item)"
:key=
"tag"
:class=
"index===0&&item.recommendTag?'tag-item-recommend':'tag-item'
"
>
{{
tag
}}
</view>
</view>
...
...
@@ -93,7 +93,7 @@
}}
</text></view
>
</view>
<view
class=
"addbox"
v-if=
"
shopState && isInRang
e"
>
<view
class=
"addbox"
v-if=
"
orderStat
e"
>
<image
v-if=
"getSku(item).state == 1"
@
click
.
stop=
"cart(item, category)"
...
...
@@ -123,7 +123,7 @@ import Utils from "@/utils/utils";
import
Order
from
"@/request/order"
;
export
default
{
name
:
"menuAssembly"
,
props
:
[
"buied"
,
"
shopState"
,
"isInRang
e"
],
props
:
[
"buied"
,
"
orderStat
e"
],
data
()
{
return
{
scrollBottom
:
{
...
...
@@ -150,14 +150,7 @@ export default {
};
},
watch
:
{
isInRange
(
val
)
{
if
(
!
val
)
{
this
.
scrollBottom
[
"--scroll-marginbottom"
]
=
131
+
"rpx"
;
}
else
{
this
.
scrollBottom
[
"--scroll-marginbottom"
]
=
0
+
"rpx"
;
}
},
shopState
(
val
)
{
orderState
(
val
)
{
if
(
!
val
)
{
this
.
scrollBottom
[
"--scroll-marginbottom"
]
=
131
+
"rpx"
;
}
else
{
...
...
@@ -227,6 +220,17 @@ export default {
});
},
methods
:
{
getTags
(
item
)
{
if
(
item
.
recommendTag
)
{
if
(
item
.
tags
.
length
!=
0
){
return
item
.
tags
.
unshift
(
item
.
recommendTag
).
splice
(
0
,
3
)
}
else
{
return
[
item
.
recommendTag
]
}
}
else
{
return
item
.
tags
}
},
initScroll
()
{
this
.
scrollLeftTop
=
0
;
this
.
scrollTop
=
0
;
...
...
@@ -342,12 +346,6 @@ export default {
const
el
=
categoryPostion
.
filter
((
item
)
=>
{
return
item
.
top
<=
e
.
target
.
scrollTop
+
otherHeight
;
});
console
.
log
(
el
[
el
.
length
-
1
],
"-------------------"
,
e
.
target
.
scrollTop
+
otherHeight
,
otherHeight
);
if
(
el
[
el
.
length
-
1
])
this
.
categoryId
=
el
[
el
.
length
-
1
].
id
;
},
categoryClickMain
(
id
)
{
...
...
@@ -371,7 +369,7 @@ export default {
icon
:
"none"
,
});
}
else
{
if
(
this
.
shopState
&&
this
.
isInRang
e
)
{
if
(
this
.
orderStat
e
)
{
const
{
data
}
=
await
Order
.
checkSku
({
skuId
:
skuStatus
[
0
].
skuId
});
const
{
goods
}
=
data
.
data
;
uni
.
setStorageSync
(
...
...
@@ -534,6 +532,8 @@ export default {
.tags
{
height
:
28
rpx
;
margin-top
:
8
rpx
;
display
:
flex
;
align-items
:
center
;
.tag-item
{
font-family
:
PingFangSC-Regular
,
PingFang
SC
;
background-color
:
#f0f0f0
;
...
...
@@ -544,6 +544,16 @@ export default {
display
:
inline-block
;
margin-right
:
16
rpx
;
}
.tag-item-recommend
{
font-family
:
PingFangSC-Regular
,
PingFang
SC
;
border
:
1
rpx
solid
#EA58DD
;
padding
:
0
rpx
8
rpx
;
font-size
:
20
rpx
;
color
:
#EA58DD
;
vertical-align
:
top
;
display
:
inline-block
;
margin-right
:
16
rpx
;
}
}
.desc-box
{
...
...
components/shopCar/shopCar.vue
View file @
9a2d8da5
...
...
@@ -143,11 +143,11 @@
</view>
<view
class=
"shopClose"
v-if=
"!
shopState || !isInRang
e"
v-if=
"!
orderStat
e"
:style=
"
{ bottom: shopCar + 'rpx' }"
>
<view
class=
"content"
>
{{
!
shopState
?
"门店已休息"
:
"距离较远,门店暂停接单"
orderStateDesc
}}
</view>
</view>
<show-toast
ref=
"toast"
/>
...
...
@@ -160,7 +160,7 @@ import Menu from "@/request/menu";
import
User
from
"@/request/user"
;
import
Utils
from
"@/utils/utils"
;
export
default
{
props
:
[
"shopState"
,
"isInRange
"
],
props
:
[
"orderState"
,
"orderStateDesc
"
],
data
()
{
return
{
showShopCar
:
false
,
//是否弹出购物车列表
...
...
menuSubPackage/pages/areaSelect/areaSelect.vue
View file @
9a2d8da5
...
...
@@ -14,7 +14,12 @@
<image
:style=
"
{'height':'100%','width':'100%'}" :src="'../../../static/imgs/jiantouhei2.png'" />
</view>
</view>
<view
>
<view
v-if=
"finalList.length==0"
>
<view
class=
"emty"
>
<view
class=
"text"
>
抱歉,暂无门店,敬请期待
</view>
</view>
</view>
<view
v-else
>
<div
v-for=
"item in finalList"
:key=
"item.id"
@
click=
"selectedShop(item)"
class=
"shop_item"
:class=
"shopId==item.id?'active':''"
>
<div
class=
"header"
>
<view
class=
"name"
>
{{
item
.
name
}}
</view>
...
...
@@ -60,7 +65,7 @@ export default {
if
(
uni
.
getStorageSync
(
'shopData'
))
{
this
.
shopId
=
uni
.
getStorageSync
(
'shopData'
).
id
;
}
this
.
list
=
uni
.
getStorageSync
(
'shops'
);
this
.
list
=
uni
.
getStorageSync
(
'shops'
)
||
[]
;
this
.
areaName
=
uni
.
getStorageSync
(
'areaName'
)
},
computed
:
{
...
...
@@ -102,6 +107,18 @@ export default {
</
script
>
<
style
lang=
"scss"
scoped
>
.emty
{
.text{
text-align
:
center
;
margin-top
:
322
rpx
;
font-size
:
28
rpx
;
font-family
:
PingFangSC-Regular
,
PingFang
SC
;
font-weight
:
400
;
color
:
#999999
;
line-height
:
40
rpx
;
letter-spacing
:
1
rpx
;
}
}
.product-list
{
background
:
#F2F2F2
;
height
:
100vh
;
...
...
menuSubPackage/pages/goodsDetail/goodsDetail.vue
View file @
9a2d8da5
...
...
@@ -125,7 +125,7 @@
<view
v-if=
"size > 0"
class=
"good-select-cont"
>
<span
:class=
"
!
shopState || !isInRang
e
!
orderStat
e
? 'good-select-btn1-close'
: 'good-select-btn1'
"
...
...
@@ -137,7 +137,7 @@
<view>
<a
:class=
"
!
shopState || !isInRang
e
!
orderStat
e
? 'good-select-btn2-close'
: 'good-select-btn2'
"
...
...
@@ -149,7 +149,7 @@
<button
v-if=
"!userms"
:class=
"
!
shopState || !isInRang
e
!
orderStat
e
? 'good-select-btn2-close'
: 'good-select-btn2'
"
...
...
@@ -192,18 +192,21 @@ export default {
Utils
,
shopState
:
true
,
showSku
:
[],
isInRange
:
true
,
// isInRange: true,
orderState
:
true
,
};
},
onShow
()
{
uni
.
setStorageSync
(
"selectFlag"
,
false
);
uni
.
removeStorageSync
(
"goodsList"
);
this
.
BottomSafeHeight
=
uni
.
getStorageSync
(
"BottomSafeHeight"
);
this
.
shopState
=
JSON
.
parse
(
uni
.
getStorageSync
(
"shopState"
));
this
.
isInRange
=
uni
.
getStorageSync
(
"isInRange"
)
===
""
?
true
:
uni
.
getStorageSync
(
"isInRange"
);
this
.
orderState
=
JSON
.
parse
(
uni
.
getStorageSync
(
"shopInfo"
)).
orderState
console
.
log
(
this
.
orderState
,
'orderState'
)
// this.shopState = JSON.parse(uni.getStorageSync("shopState"));
// this.isInRange =
// uni.getStorageSync("isInRange") === ""
// ? true
// : uni.getStorageSync("isInRange");
},
mounted
()
{
// 获取胶囊坐标位置
...
...
@@ -401,7 +404,7 @@ export default {
}
},
async
shoppingCart
()
{
if
(
!
this
.
shopState
||
!
this
.
isInRang
e
)
{
if
(
!
this
.
orderStat
e
)
{
return
;
}
if
(
this
.
checkNum
(
"addShop"
))
{
...
...
@@ -426,7 +429,7 @@ export default {
}
},
async
getallNum
(
e
)
{
if
(
!
this
.
shopState
||
!
this
.
isInRang
e
)
{
if
(
!
this
.
orderStat
e
)
{
return
;
}
const
gosettleFun
=
async
()
=>
{
...
...
@@ -499,7 +502,7 @@ export default {
}
else
{
checkLocak
();
}
if
(
!
this
.
shopState
||
!
this
.
isInRang
e
)
{
if
(
!
this
.
orderStat
e
)
{
return
;
}
...
...
@@ -531,7 +534,7 @@ export default {
},
UseIt
(
ruleId
)
{
return
(
this
.
available
.
indexOf
(
ruleId
)
==
-
1
&&
this
.
shopState
&&
this
.
isInRang
e
this
.
available
.
indexOf
(
ruleId
)
==
-
1
&&
this
.
orderStat
e
);
},
ShowIt
(
ruleId
)
{
...
...
orderSubPackage/pages/orderInfo/index.vue
View file @
9a2d8da5
...
...
@@ -25,10 +25,11 @@
'margin-top': statusBarHeight + navigationBarHeight + getPx(32) + 'px',
}"
>
<view
class=
"code"
>
<view
class=
"code"
v-if=
"isBulid"
>
<view
class=
"code_label"
>
取单号:
</view>
<view
class=
"code_content"
>
{{
orderInfo
.
orderNum
}}
</view>
</view>
<view
v-else
class=
"status_text"
>
订单状态:
{{
orderStatusText
}}
</view>
<view
class=
"tips"
>
<view
v-if=
"orderInfo.state == 7"
>
制作完成请取杯,享用愉快!
</view>
<view
v-if=
"orderInfo.state == 4"
>
制作完成请取杯,享用愉快!
</view>
...
...
@@ -65,7 +66,7 @@
</view>
</view>
</view>
<
!--
<div
class=
"btns
"
>
<
div
class=
"btns"
v-if=
"orderInfo.state == 1||(orderInfo.state != 1&&orderInfo.state != 2)||(checkStatus(orderInfo.state, [12, 13, 14, 15]))
"
>
<a
type=
"primary"
@
click=
"cancelOrder"
...
...
@@ -82,15 +83,8 @@
>
<a
type=
"primary"
@
click=
"toRefund"
v-if=
"orderInfo.state == 2"
class=
"btn_cancel"
>
申请退款
</a
>
<a
type=
"primary"
@
click=
"oneMoreOrder(orderInfo)"
v-if=
"orderInfo.state != 1"
v-if=
"orderInfo.state != 1
&&orderInfo.state != 2
"
class=
"btn"
>
再来一单
</a
>
...
...
@@ -101,7 +95,7 @@
class=
"btn_cancel"
>
退款详情
</a
>
</div>
-->
</div>
<!--
</div>
<div
class=
"order_flow"
v-if=
"qrShow"
>
-->
<!--
<div
v-if=
"qrShow"
class=
"code"
>
取单码
{{
orderInfo
.
orderNum
}}
</div>
-->
...
...
pages/menu/menu.vue
View file @
9a2d8da5
...
...
@@ -21,7 +21,7 @@
<!--
<HomeBanner
/>
-->
<view
class=
"shop-info"
:style=
"'top:100rpx'"
>
<view
class=
"shop-box"
>
<text
@
click=
"showArea"
class=
"shop-name"
>
{{
shopInfo
.
name
}}
</text>
<text
@
click=
"showArea"
class=
"shop-name"
>
{{
!
shopInfo
.
orderState
?
'选择店铺'
:
shopInfo
.
name
}}
</text>
<image
class=
"arrow-right-select"
:src=
"'../../static/imgs/jiantoubai.png'"
...
...
@@ -101,28 +101,38 @@
<MenuAssembly
ref=
"MenuAssembly"
@
getallNum=
"getallNum"
:orderState=
"shopInfo.orderState"
:buied=
"buied"
:shopState=
"shopState"
:isInRange=
"isInRange"
/>
<!--
<u-picker
@
cancel=
"show = false"
:show=
"show"
:immediateChange=
"true"
ref=
"uPicker"
:columns=
"columns"
@
confirm=
"confirm"
keyName=
"name"
@
change=
"changeHandler"
></u-picker>
-->
<AreaPicker
ref=
"AreaPicker"
/>
<canvas
class=
"canvas-code"
canvas-id=
"myQrcode2"
style=
"
background: #fff;
width: 200px;
height: 200px;
display: block;
left: -800rpx;
position: absolute;
"
/>
<show-toast
ref=
"toast"
/>
<taBar
select=
"0"
></taBar>
<ShopCar
ref=
"shopbar"
:shopState=
"shopState"
:isInRange=
"isInRange"
/>
<ShopCar
ref=
"shopbar"
:orderState=
"shopInfo.orderState"
:orderStateDesc=
"shopInfo.stateDesc"
/>
<u-popup
:show=
"locationPopup"
:round=
"10"
mode=
"bottom"
z-index=
"209999"
>
<view
class=
"location"
>
<view
class=
"title"
>
<image
:src=
"'/static/imgs/location_icon.png'"
></image>
<view>
手机定位未开启
</view>
</view>
<view
class=
"content"
>
避免下错单!请点击 “开启” 定位,或手动选择当前所在位置的店铺。
</view>
<view
class=
"btn"
>
<view
:style=
"
{'color':'#0cc161','background':'#f2f2f2'}" @click="cancelLocaTion">手动选择
</view>
<view
:style=
"
{'color':'#f2f2f2','background':'#0cc161'}" @click="goSet">开启
</view>
</view>
</view>
</u-popup>
<u-popup
:show=
"tipPopup"
:round=
"10"
:safeAreaInsetBottom=
"false"
@
close=
"tipPopup=false"
mode=
"bottom"
mask-close-able
zIndex=
"10078"
>
<view
class=
"location"
>
<view
class=
"content_tipPopup"
>
附近无可用门店,请重新选择
</view>
</view>
</u-popup>
</view>
</
template
>
<
script
>
...
...
@@ -140,6 +150,8 @@ import Order from "@/request/order";
import
OrderQrCode
from
"@/components/OrderQrCode"
;
import
QRCode
from
"@/utils/qrCode"
;
var
QQMapWX
=
require
(
'../../static/js/qqmap-wx-jssdk'
);
var
qqmapsdk
;
export
default
{
components
:
{
ShopCar
,
...
...
@@ -158,44 +170,13 @@ export default {
customerName
:
""
,
loginInfo
:
""
,
img
:
""
,
isInRange
:
true
,
dayTitle
:
""
// isInRange: true,
dayTitle
:
""
,
locationPopup
:
false
,
tipPopup
:
false
};
},
computed
:
{
shopState
()
{
console
.
log
(
this
.
shopInfo
);
const
{
shopInfo
}
=
this
;
const
{
startTime
,
endTime
,
state
}
=
shopInfo
;
if
(
!
startTime
||
!
endTime
||
(
!
state
&&
state
!==
0
))
return
true
;
function
getNowFormatDate
()
{
let
date
=
new
Date
(),
seperator1
=
"/"
,
//格式分隔符
year
=
date
.
getFullYear
(),
//获取完整的年份(4位)
month
=
date
.
getMonth
()
+
1
,
//获取当前月份(0-11,0代表1月)
strDate
=
date
.
getDate
();
// 获取当前日(1-31)
if
(
month
>=
1
&&
month
<=
9
)
month
=
"0"
+
month
;
// 如果月份是个位数,在前面补0
if
(
strDate
>=
0
&&
strDate
<=
9
)
strDate
=
"0"
+
strDate
;
// 如果日是个位数,在前面补0
let
currentdate
=
year
+
seperator1
+
month
+
seperator1
+
strDate
;
return
currentdate
;
}
const
startTimeNew
=
Date
.
parse
(
getNowFormatDate
()
+
" "
+
startTime
+
":00"
);
const
endTimeNew
=
Date
.
parse
(
getNowFormatDate
()
+
" "
+
endTime
+
":00"
);
if
(
startTimeNew
<
new
Date
().
valueOf
()
&&
new
Date
().
valueOf
()
<
endTimeNew
&&
(
state
===
1
||
state
===
0
)
)
{
uni
.
setStorageSync
(
"shopState"
,
true
);
return
true
;
}
else
{
uni
.
setStorageSync
(
"shopState"
,
false
);
return
false
;
}
},
userms
()
{
return
this
.
$store
.
getters
.
Authorization
;
},
...
...
@@ -224,6 +205,9 @@ export default {
// }
},
onLoad
:
async
function
(
option
)
{
qqmapsdk
=
new
QQMapWX
({
key
:
'WC5BZ-3UBE3-3OJ3S-Y3O7N-WV4S5-HCBZ4'
});
// 通过扫码进入
const
{
q
}
=
option
;
if
(
q
)
{
...
...
@@ -269,7 +253,9 @@ export default {
},
onHide
()
{
this
.
$refs
.
shopbar
.
showShopCar
=
false
;
if
(
this
.
userms
){
this
.
$refs
.
OrderQrCode
.
cleanTimeout
(
this
.
shopInfo
);
}
},
// 微信小程序右上角分享
onShareAppMessage
()
{
...
...
@@ -295,6 +281,71 @@ export default {
this
.
getHomeOrder
();
},
methods
:
{
// 获取省市区
getCity
(
latitude
,
longitude
){
return
new
Promise
((
resolve
,
reject
)
=>
{
qqmapsdk
.
reverseGeocoder
({
location
:
{
latitude
,
longitude
},
success
:
function
(
res
)
{
let
obj
=
{
province
:
res
.
result
.
address_component
.
province
,
city
:
res
.
result
.
address_component
.
city
,
area
:
res
.
result
.
address_component
.
district
}
resolve
(
obj
)
},
fail
(
res
)
{
console
.
log
(
res
,
'报错了'
)
reject
(
res
)
},
})
})
},
// 未授权地理位置手动选择店铺
async
cancelLocaTion
()
{
this
.
locationPopup
=
false
let
{
data
}
=
await
Menu
.
getLocationShops
({});
if
(
data
.
code
===
200
)
{
const
shopList
=
data
.
data
||
[]
if
(
shopList
.
length
!=
0
)
{
this
.
getCity
(
shopList
[
0
].
lat
,
shopList
[
0
].
lng
).
then
(
res
=>
{
const
{
province
,
city
,
area
}
=
res
const
areaName
=
{
proviceName
:
province
,
cityName
:
city
,
disName
:
area
}
uni
.
setStorageSync
(
'shops'
,
shopList
);
uni
.
setStorageSync
(
'areaName'
,
areaName
);
uni
.
navigateTo
({
url
:
'/menuSubPackage/pages/areaSelect/areaSelect'
})
})
}
}
},
// 打开设置页面
goSet
()
{
this
.
locationPopup
=
false
uni
.
openSetting
({
success
:()
=>
{
uni
.
getSetting
({
success
:
(
res
)
=>
{
console
.
log
(
res
,
'res'
)
// 已经授权位置不获取默认店铺
if
(
res
.
authSetting
[
"scope.userLocation"
])
{
console
.
log
(
'开启权限成功'
);
this
.
getLocationShops
()
}
else
{
console
.
log
(
'开启权限失败'
);
}
},
});
}
})
},
// 分享方法
getShareData
(
type
)
{
let
title
=
"随手一杯好咖啡"
;
let
path
=
`/pages/menu/menu`
;
...
...
@@ -305,6 +356,7 @@ export default {
path
,
};
},
// 获取商品列表和店铺信息
getShopMenus
(
params
)
{
$EventBus
.
$off
(
"getMenuList"
);
$EventBus
.
$on
(
"getMenuList"
,
(
data
)
=>
{
...
...
@@ -316,28 +368,32 @@ export default {
}
}
this
.
shopInfo
=
data
;
if
(
!
this
.
shopInfo
.
orderState
)
{
this
.
tipPopup
=
true
}
uni
.
setStorageSync
(
"shopInfo"
,
JSON
.
stringify
(
this
.
shopInfo
));
this
.
getMenuList
(
data
.
id
);
this
.
getHomeOrder
(
data
.
id
);
this
.
getBanerList
(
data
.
id
)
// 判断店铺是否在范围内
const
shopInfo
=
uni
.
getStorageSync
(
"shopInfo"
);
const
{
distanceLimit
,
realDistance
}
=
JSON
.
parse
(
shopInfo
);
const
distance
=
realDistance
/
1000
;
if
(
!
distanceLimit
)
{
this
.
isInRange
=
true
;
}
else
{
console
.
log
(
parseInt
(
distance
),
parseInt
(
distanceLimit
),
JSON
.
parse
(
shopInfo
)
);
this
.
isInRange
=
parseInt
(
distance
)
<
parseInt
(
distanceLimit
);
}
uni
.
setStorageSync
(
"isInRange"
,
this
.
isInRange
);
//
const shopInfo = uni.getStorageSync("shopInfo");
//
const { distanceLimit, realDistance } = JSON.parse(shopInfo);
//
const distance = realDistance / 1000;
//
if (!distanceLimit) {
//
this.isInRange = true;
//
} else {
//
console.log(
//
parseInt(distance),
//
parseInt(distanceLimit),
//
JSON.parse(shopInfo)
//
);
//
this.isInRange = parseInt(distance)
<
parseInt
(
distanceLimit
);
//
}
//
uni.setStorageSync("isInRange", this.isInRange);
});
User
.
getShopInfo
(
params
);
},
// 获取店铺轮播图信息
async
getBanerList
(
id
=
this
.
shopInfo
.
id
)
{
const
{
data
=
{}}
=
await
Menu
.
getSwiperList
({
id
});
...
...
@@ -349,8 +405,8 @@ export default {
}
this
.
$store
.
commit
(
"setSwiperList"
,
sendData
);
}
console
.
log
(
data
)
},
// 获取首页订单 设置样式用到
async
getHomeOrder
(
id
=
this
.
shopInfo
.
id
)
{
if
(
!
this
.
userms
)
return
;
const
res
=
await
Order
.
getHomeOrder
({
shopId
:
id
});
...
...
@@ -367,29 +423,52 @@ export default {
this
.
buied
=
false
;
}
},
// 打开取餐码弹框
openQrcode
()
{
// 不生成二维码
// if(['2', '3'].indexOf(this.orderInfo.state) != -1){
// this.$refs.OrderQrCode.open(this.orderInfo, "");
// return;
// } else {
this
.
$refs
.
OrderQrCode
.
open
(
this
.
orderInfo
,
this
.
orderInfo
.
pickCode
);
// }
// new QRCode('myQrcode2', {
// text: this.orderInfo.pickCode,
// width: 141, //canvas 画布的宽
// height: 141, //canvas 画布的高
// padding: 0, // 生成二维码四周自动留边宽度,不传入默认为0
// correctLevel: QRCode.CorrectLevel.L, // 二维码可辨识度
// callback: (res) => {
// this.$refs.OrderQrCode.open(this.orderInfo, res.path)
// }
// })
},
// 通过经纬度获取店铺列表
getLocationShops
()
{
User
.
getLocation
((
state
,
params
)
=>
{
const
{
lat
,
lng
}
=
params
this
.
getCity
(
lat
,
lng
).
then
(
async
res
=>
{
const
{
province
,
city
,
area
}
=
res
const
sendData
=
{
lng
,
lat
,
province
,
city
,
area
}
let
{
data
}
=
await
Menu
.
getLocationShops
(
sendData
);
if
(
data
.
code
===
200
)
{
const
areaName
=
{
proviceName
:
province
,
cityName
:
city
,
disName
:
area
}
uni
.
setStorageSync
(
'shops'
,
data
?.
data
);
uni
.
setStorageSync
(
'areaName'
,
areaName
);
uni
.
navigateTo
({
url
:
'/menuSubPackage/pages/areaSelect/areaSelect'
})
}
})
});
},
// 点击店铺名称
showArea
()
{
console
.
log
(
this
.
$refs
);
this
.
$refs
.
AreaPicker
.
showArea
();
uni
.
getSetting
({
success
:
(
res
)
=>
{
// 已经授权位置不获取默认店铺
if
(
res
.
authSetting
[
"scope.userLocation"
])
{
console
.
log
(
"允许授权位置,调回接口获取店铺列表"
);
this
.
getLocationShops
()
}
else
{
console
.
log
(
"拒绝授权位置,打开权限控制页面"
);
this
.
locationPopup
=
true
}
},
});
// this.$refs.AreaPicker.showArea();
},
// 手机号授权登录
async
getPhoneNumber
(
e
)
{
...
...
@@ -399,8 +478,8 @@ export default {
this
.
getHomeOrder
()
uni
.
getSetting
({
success
:
(
res
)
=>
{
// 已经授权位置不获取默认店铺
if
(
!
res
.
authSetting
[
"scope.userLocation"
])
{
console
.
log
(
'拒绝位置授权,获取上次下单店铺'
)
this
.
getShopMenus
()
}
},
...
...
@@ -503,6 +582,54 @@ export default {
</
script
>
<
style
lang=
"scss"
scoped
>
.location
{
background
:
#ffffff
;
border-radius
:
20
rpx
20
rpx
0
rpx
0
rpx
;
padding
:
50
rpx
;
.title
{
display
:
flex
;
align-items
:
center
;
image
{
width
:
60
rpx
;
height
:
60
rpx
;
}
view
{
margin-left
:
10
rpx
;
font-weight
:
600
;
}
}
.content
{
color
:
#757575
;
font-size
:
27.5
rpx
;
letter-spacing
:
0
rpx
;
padding
:
40
rpx
0
rpx
;
}
.content_tipPopup
{
color
:
#757575
;
font-size
:
38
rpx
;
text-align
:
center
;
letter-spacing
:
0
rpx
;
padding
:
80
rpx
0
rpx
;
}
.btn
{
margin-top
:
10
rpx
;
display
:
flex
;
margin
:
30
rpx
auto
;
align-items
:
center
;
justify-content
:
space-around
;
font-size
:
32
rpx
;
width
:
70%
;
view{
height
:
70
rpx
;
line-height
:
70
rpx
;
width
:
200
rpx
;
text-align
:
center
;
border-radius
:
10
rpx
;
}
}
}
.menu-box
{
min-height
:
100vh
;
...
...
request/menu/index.js
View file @
9a2d8da5
...
...
@@ -158,5 +158,20 @@ export default {
// uni.showToast({ title: '哎哟!刚刚走神了,请退出后重进', icon: 'none' })
console
.
log
(
"哎哟!刚刚走神了,请退出后重进"
);
});
},
// 根据经纬度获取店铺
getLocationShops
(
data
)
{
return
uni
.
$u
.
http
.
post
(
"/weixin/v2/getLocationShops"
,
data
)
.
then
((
res
)
=>
{
return
res
;
})
.
catch
((
err
)
=>
{
context
.
showToast
({
title
:
"哎哟!刚刚走神了,请退出后重进"
,
icon
:
"none"
,
});
return
err
;
});
}
};
request/user/index.js
View file @
9a2d8da5
...
...
@@ -31,7 +31,7 @@ export default {
// 获取店铺信息
getShopInfo
(
params
)
{
return
uni
.
$u
.
http
.
get
(
"/weixin/getShop"
,
{
params
})
.
get
(
"/weixin/
v2/
getShop"
,
{
params
})
.
then
((
res
)
=>
{
// console.log("get shop:"+JSON.stringify(res.data.data));
if
(
res
.
data
.
code
==
200
)
{
...
...
static/imgs/location_icon.png
0 → 100644
View file @
9a2d8da5
1.69 KB
static/js/qqmap-wx-jssdk.js
0 → 100644
View file @
9a2d8da5
/**
* 微信小程序JavaScriptSDK
*
* @version 1.2
* @date 2019-03-06
*/
var
ERROR_CONF
=
{
KEY_ERR
:
311
,
KEY_ERR_MSG
:
'key格式错误'
,
PARAM_ERR
:
310
,
PARAM_ERR_MSG
:
'请求参数信息有误'
,
SYSTEM_ERR
:
600
,
SYSTEM_ERR_MSG
:
'系统错误'
,
WX_ERR_CODE
:
1000
,
WX_OK_CODE
:
200
};
var
BASE_URL
=
'https://apis.map.qq.com/ws/'
;
var
URL_SEARCH
=
BASE_URL
+
'place/v1/search'
;
var
URL_SUGGESTION
=
BASE_URL
+
'place/v1/suggestion'
;
var
URL_GET_GEOCODER
=
BASE_URL
+
'geocoder/v1/'
;
var
URL_CITY_LIST
=
BASE_URL
+
'district/v1/list'
;
var
URL_AREA_LIST
=
BASE_URL
+
'district/v1/getchildren'
;
var
URL_DISTANCE
=
BASE_URL
+
'distance/v1/'
;
var
URL_DIRECTION
=
BASE_URL
+
'direction/v1/'
;
var
MODE
=
{
driving
:
'driving'
,
transit
:
'transit'
};
var
EARTH_RADIUS
=
6378136.49
;
var
Utils
=
{
/**
* md5加密方法
* 版权所有©2011 Sebastian Tschan,https://blueimp.net
*/
safeAdd
(
x
,
y
)
{
var
lsw
=
(
x
&
0xffff
)
+
(
y
&
0xffff
);
var
msw
=
(
x
>>
16
)
+
(
y
>>
16
)
+
(
lsw
>>
16
);
return
(
msw
<<
16
)
|
(
lsw
&
0xffff
);
},
bitRotateLeft
(
num
,
cnt
)
{
return
(
num
<<
cnt
)
|
(
num
>>>
(
32
-
cnt
));
},
md5cmn
(
q
,
a
,
b
,
x
,
s
,
t
)
{
return
this
.
safeAdd
(
this
.
bitRotateLeft
(
this
.
safeAdd
(
this
.
safeAdd
(
a
,
q
),
this
.
safeAdd
(
x
,
t
)),
s
),
b
);
},
md5ff
(
a
,
b
,
c
,
d
,
x
,
s
,
t
)
{
return
this
.
md5cmn
((
b
&
c
)
|
(
~
b
&
d
),
a
,
b
,
x
,
s
,
t
);
},
md5gg
(
a
,
b
,
c
,
d
,
x
,
s
,
t
)
{
return
this
.
md5cmn
((
b
&
d
)
|
(
c
&
~
d
),
a
,
b
,
x
,
s
,
t
);
},
md5hh
(
a
,
b
,
c
,
d
,
x
,
s
,
t
)
{
return
this
.
md5cmn
(
b
^
c
^
d
,
a
,
b
,
x
,
s
,
t
);
},
md5ii
(
a
,
b
,
c
,
d
,
x
,
s
,
t
)
{
return
this
.
md5cmn
(
c
^
(
b
|
~
d
),
a
,
b
,
x
,
s
,
t
);
},
binlMD5
(
x
,
len
)
{
/* append padding */
x
[
len
>>
5
]
|=
0x80
<<
(
len
%
32
);
x
[((
len
+
64
)
>>>
9
<<
4
)
+
14
]
=
len
;
var
i
;
var
olda
;
var
oldb
;
var
oldc
;
var
oldd
;
var
a
=
1732584193
;
var
b
=
-
271733879
;
var
c
=
-
1732584194
;
var
d
=
271733878
;
for
(
i
=
0
;
i
<
x
.
length
;
i
+=
16
)
{
olda
=
a
;
oldb
=
b
;
oldc
=
c
;
oldd
=
d
;
a
=
this
.
md5ff
(
a
,
b
,
c
,
d
,
x
[
i
],
7
,
-
680876936
);
d
=
this
.
md5ff
(
d
,
a
,
b
,
c
,
x
[
i
+
1
],
12
,
-
389564586
);
c
=
this
.
md5ff
(
c
,
d
,
a
,
b
,
x
[
i
+
2
],
17
,
606105819
);
b
=
this
.
md5ff
(
b
,
c
,
d
,
a
,
x
[
i
+
3
],
22
,
-
1044525330
);
a
=
this
.
md5ff
(
a
,
b
,
c
,
d
,
x
[
i
+
4
],
7
,
-
176418897
);
d
=
this
.
md5ff
(
d
,
a
,
b
,
c
,
x
[
i
+
5
],
12
,
1200080426
);
c
=
this
.
md5ff
(
c
,
d
,
a
,
b
,
x
[
i
+
6
],
17
,
-
1473231341
);
b
=
this
.
md5ff
(
b
,
c
,
d
,
a
,
x
[
i
+
7
],
22
,
-
45705983
);
a
=
this
.
md5ff
(
a
,
b
,
c
,
d
,
x
[
i
+
8
],
7
,
1770035416
);
d
=
this
.
md5ff
(
d
,
a
,
b
,
c
,
x
[
i
+
9
],
12
,
-
1958414417
);
c
=
this
.
md5ff
(
c
,
d
,
a
,
b
,
x
[
i
+
10
],
17
,
-
42063
);
b
=
this
.
md5ff
(
b
,
c
,
d
,
a
,
x
[
i
+
11
],
22
,
-
1990404162
);
a
=
this
.
md5ff
(
a
,
b
,
c
,
d
,
x
[
i
+
12
],
7
,
1804603682
);
d
=
this
.
md5ff
(
d
,
a
,
b
,
c
,
x
[
i
+
13
],
12
,
-
40341101
);
c
=
this
.
md5ff
(
c
,
d
,
a
,
b
,
x
[
i
+
14
],
17
,
-
1502002290
);
b
=
this
.
md5ff
(
b
,
c
,
d
,
a
,
x
[
i
+
15
],
22
,
1236535329
);
a
=
this
.
md5gg
(
a
,
b
,
c
,
d
,
x
[
i
+
1
],
5
,
-
165796510
);
d
=
this
.
md5gg
(
d
,
a
,
b
,
c
,
x
[
i
+
6
],
9
,
-
1069501632
);
c
=
this
.
md5gg
(
c
,
d
,
a
,
b
,
x
[
i
+
11
],
14
,
643717713
);
b
=
this
.
md5gg
(
b
,
c
,
d
,
a
,
x
[
i
],
20
,
-
373897302
);
a
=
this
.
md5gg
(
a
,
b
,
c
,
d
,
x
[
i
+
5
],
5
,
-
701558691
);
d
=
this
.
md5gg
(
d
,
a
,
b
,
c
,
x
[
i
+
10
],
9
,
38016083
);
c
=
this
.
md5gg
(
c
,
d
,
a
,
b
,
x
[
i
+
15
],
14
,
-
660478335
);
b
=
this
.
md5gg
(
b
,
c
,
d
,
a
,
x
[
i
+
4
],
20
,
-
405537848
);
a
=
this
.
md5gg
(
a
,
b
,
c
,
d
,
x
[
i
+
9
],
5
,
568446438
);
d
=
this
.
md5gg
(
d
,
a
,
b
,
c
,
x
[
i
+
14
],
9
,
-
1019803690
);
c
=
this
.
md5gg
(
c
,
d
,
a
,
b
,
x
[
i
+
3
],
14
,
-
187363961
);
b
=
this
.
md5gg
(
b
,
c
,
d
,
a
,
x
[
i
+
8
],
20
,
1163531501
);
a
=
this
.
md5gg
(
a
,
b
,
c
,
d
,
x
[
i
+
13
],
5
,
-
1444681467
);
d
=
this
.
md5gg
(
d
,
a
,
b
,
c
,
x
[
i
+
2
],
9
,
-
51403784
);
c
=
this
.
md5gg
(
c
,
d
,
a
,
b
,
x
[
i
+
7
],
14
,
1735328473
);
b
=
this
.
md5gg
(
b
,
c
,
d
,
a
,
x
[
i
+
12
],
20
,
-
1926607734
);
a
=
this
.
md5hh
(
a
,
b
,
c
,
d
,
x
[
i
+
5
],
4
,
-
378558
);
d
=
this
.
md5hh
(
d
,
a
,
b
,
c
,
x
[
i
+
8
],
11
,
-
2022574463
);
c
=
this
.
md5hh
(
c
,
d
,
a
,
b
,
x
[
i
+
11
],
16
,
1839030562
);
b
=
this
.
md5hh
(
b
,
c
,
d
,
a
,
x
[
i
+
14
],
23
,
-
35309556
);
a
=
this
.
md5hh
(
a
,
b
,
c
,
d
,
x
[
i
+
1
],
4
,
-
1530992060
);
d
=
this
.
md5hh
(
d
,
a
,
b
,
c
,
x
[
i
+
4
],
11
,
1272893353
);
c
=
this
.
md5hh
(
c
,
d
,
a
,
b
,
x
[
i
+
7
],
16
,
-
155497632
);
b
=
this
.
md5hh
(
b
,
c
,
d
,
a
,
x
[
i
+
10
],
23
,
-
1094730640
);
a
=
this
.
md5hh
(
a
,
b
,
c
,
d
,
x
[
i
+
13
],
4
,
681279174
);
d
=
this
.
md5hh
(
d
,
a
,
b
,
c
,
x
[
i
],
11
,
-
358537222
);
c
=
this
.
md5hh
(
c
,
d
,
a
,
b
,
x
[
i
+
3
],
16
,
-
722521979
);
b
=
this
.
md5hh
(
b
,
c
,
d
,
a
,
x
[
i
+
6
],
23
,
76029189
);
a
=
this
.
md5hh
(
a
,
b
,
c
,
d
,
x
[
i
+
9
],
4
,
-
640364487
);
d
=
this
.
md5hh
(
d
,
a
,
b
,
c
,
x
[
i
+
12
],
11
,
-
421815835
);
c
=
this
.
md5hh
(
c
,
d
,
a
,
b
,
x
[
i
+
15
],
16
,
530742520
);
b
=
this
.
md5hh
(
b
,
c
,
d
,
a
,
x
[
i
+
2
],
23
,
-
995338651
);
a
=
this
.
md5ii
(
a
,
b
,
c
,
d
,
x
[
i
],
6
,
-
198630844
);
d
=
this
.
md5ii
(
d
,
a
,
b
,
c
,
x
[
i
+
7
],
10
,
1126891415
);
c
=
this
.
md5ii
(
c
,
d
,
a
,
b
,
x
[
i
+
14
],
15
,
-
1416354905
);
b
=
this
.
md5ii
(
b
,
c
,
d
,
a
,
x
[
i
+
5
],
21
,
-
57434055
);
a
=
this
.
md5ii
(
a
,
b
,
c
,
d
,
x
[
i
+
12
],
6
,
1700485571
);
d
=
this
.
md5ii
(
d
,
a
,
b
,
c
,
x
[
i
+
3
],
10
,
-
1894986606
);
c
=
this
.
md5ii
(
c
,
d
,
a
,
b
,
x
[
i
+
10
],
15
,
-
1051523
);
b
=
this
.
md5ii
(
b
,
c
,
d
,
a
,
x
[
i
+
1
],
21
,
-
2054922799
);
a
=
this
.
md5ii
(
a
,
b
,
c
,
d
,
x
[
i
+
8
],
6
,
1873313359
);
d
=
this
.
md5ii
(
d
,
a
,
b
,
c
,
x
[
i
+
15
],
10
,
-
30611744
);
c
=
this
.
md5ii
(
c
,
d
,
a
,
b
,
x
[
i
+
6
],
15
,
-
1560198380
);
b
=
this
.
md5ii
(
b
,
c
,
d
,
a
,
x
[
i
+
13
],
21
,
1309151649
);
a
=
this
.
md5ii
(
a
,
b
,
c
,
d
,
x
[
i
+
4
],
6
,
-
145523070
);
d
=
this
.
md5ii
(
d
,
a
,
b
,
c
,
x
[
i
+
11
],
10
,
-
1120210379
);
c
=
this
.
md5ii
(
c
,
d
,
a
,
b
,
x
[
i
+
2
],
15
,
718787259
);
b
=
this
.
md5ii
(
b
,
c
,
d
,
a
,
x
[
i
+
9
],
21
,
-
343485551
);
a
=
this
.
safeAdd
(
a
,
olda
);
b
=
this
.
safeAdd
(
b
,
oldb
);
c
=
this
.
safeAdd
(
c
,
oldc
);
d
=
this
.
safeAdd
(
d
,
oldd
);
}
return
[
a
,
b
,
c
,
d
];
},
binl2rstr
(
input
)
{
var
i
;
var
output
=
''
;
var
length32
=
input
.
length
*
32
;
for
(
i
=
0
;
i
<
length32
;
i
+=
8
)
{
output
+=
String
.
fromCharCode
((
input
[
i
>>
5
]
>>>
(
i
%
32
))
&
0xff
);
}
return
output
;
},
rstr2binl
(
input
)
{
var
i
;
var
output
=
[];
output
[(
input
.
length
>>
2
)
-
1
]
=
undefined
;
for
(
i
=
0
;
i
<
output
.
length
;
i
+=
1
)
{
output
[
i
]
=
0
;
}
var
length8
=
input
.
length
*
8
;
for
(
i
=
0
;
i
<
length8
;
i
+=
8
)
{
output
[
i
>>
5
]
|=
(
input
.
charCodeAt
(
i
/
8
)
&
0xff
)
<<
(
i
%
32
);
}
return
output
;
},
rstrMD5
(
s
)
{
return
this
.
binl2rstr
(
this
.
binlMD5
(
this
.
rstr2binl
(
s
),
s
.
length
*
8
));
},
rstrHMACMD5
(
key
,
data
)
{
var
i
;
var
bkey
=
this
.
rstr2binl
(
key
);
var
ipad
=
[];
var
opad
=
[];
var
hash
;
ipad
[
15
]
=
opad
[
15
]
=
undefined
;
if
(
bkey
.
length
>
16
)
{
bkey
=
this
.
binlMD5
(
bkey
,
key
.
length
*
8
);
}
for
(
i
=
0
;
i
<
16
;
i
+=
1
)
{
ipad
[
i
]
=
bkey
[
i
]
^
0x36363636
;
opad
[
i
]
=
bkey
[
i
]
^
0x5c5c5c5c
;
}
hash
=
this
.
binlMD5
(
ipad
.
concat
(
this
.
rstr2binl
(
data
)),
512
+
data
.
length
*
8
);
return
this
.
binl2rstr
(
this
.
binlMD5
(
opad
.
concat
(
hash
),
512
+
128
));
},
rstr2hex
(
input
)
{
var
hexTab
=
'0123456789abcdef'
;
var
output
=
''
;
var
x
;
var
i
;
for
(
i
=
0
;
i
<
input
.
length
;
i
+=
1
)
{
x
=
input
.
charCodeAt
(
i
);
output
+=
hexTab
.
charAt
((
x
>>>
4
)
&
0x0f
)
+
hexTab
.
charAt
(
x
&
0x0f
);
}
return
output
;
},
str2rstrUTF8
(
input
)
{
return
unescape
(
encodeURIComponent
(
input
));
},
rawMD5
(
s
)
{
return
this
.
rstrMD5
(
this
.
str2rstrUTF8
(
s
));
},
hexMD5
(
s
)
{
return
this
.
rstr2hex
(
this
.
rawMD5
(
s
));
},
rawHMACMD5
(
k
,
d
)
{
return
this
.
rstrHMACMD5
(
this
.
str2rstrUTF8
(
k
),
str2rstrUTF8
(
d
));
},
hexHMACMD5
(
k
,
d
)
{
return
this
.
rstr2hex
(
this
.
rawHMACMD5
(
k
,
d
));
},
md5
(
string
,
key
,
raw
)
{
if
(
!
key
)
{
if
(
!
raw
)
{
return
this
.
hexMD5
(
string
);
}
return
this
.
rawMD5
(
string
);
}
if
(
!
raw
)
{
return
this
.
hexHMACMD5
(
key
,
string
);
}
return
this
.
rawHMACMD5
(
key
,
string
);
},
/**
* 得到md5加密后的sig参数
* @param {Object} requestParam 接口参数
* @param {String} sk签名字符串
* @param {String} featrue 方法名
* @return 返回加密后的sig参数
*/
getSig
(
requestParam
,
sk
,
feature
,
mode
)
{
var
sig
=
null
;
var
requestArr
=
[];
Object
.
keys
(
requestParam
).
sort
().
forEach
(
function
(
key
){
requestArr
.
push
(
key
+
'='
+
requestParam
[
key
]);
});
if
(
feature
==
'search'
)
{
sig
=
'/ws/place/v1/search?'
+
requestArr
.
join
(
'&'
)
+
sk
;
}
if
(
feature
==
'suggest'
)
{
sig
=
'/ws/place/v1/suggestion?'
+
requestArr
.
join
(
'&'
)
+
sk
;
}
if
(
feature
==
'reverseGeocoder'
)
{
sig
=
'/ws/geocoder/v1/?'
+
requestArr
.
join
(
'&'
)
+
sk
;
}
if
(
feature
==
'geocoder'
)
{
sig
=
'/ws/geocoder/v1/?'
+
requestArr
.
join
(
'&'
)
+
sk
;
}
if
(
feature
==
'getCityList'
)
{
sig
=
'/ws/district/v1/list?'
+
requestArr
.
join
(
'&'
)
+
sk
;
}
if
(
feature
==
'getDistrictByCityId'
)
{
sig
=
'/ws/district/v1/getchildren?'
+
requestArr
.
join
(
'&'
)
+
sk
;
}
if
(
feature
==
'calculateDistance'
)
{
sig
=
'/ws/distance/v1/?'
+
requestArr
.
join
(
'&'
)
+
sk
;
}
if
(
feature
==
'direction'
)
{
sig
=
'/ws/direction/v1/'
+
mode
+
'?'
+
requestArr
.
join
(
'&'
)
+
sk
;
}
sig
=
this
.
md5
(
sig
);
return
sig
;
},
/**
* 得到终点query字符串
* @param {Array|String} 检索数据
*/
location2query
(
data
)
{
if
(
typeof
data
==
'string'
)
{
return
data
;
}
var
query
=
''
;
for
(
var
i
=
0
;
i
<
data
.
length
;
i
++
)
{
var
d
=
data
[
i
];
if
(
!!
query
)
{
query
+=
';'
;
}
if
(
d
.
location
)
{
query
=
query
+
d
.
location
.
lat
+
','
+
d
.
location
.
lng
;
}
if
(
d
.
latitude
&&
d
.
longitude
)
{
query
=
query
+
d
.
latitude
+
','
+
d
.
longitude
;
}
}
return
query
;
},
/**
* 计算角度
*/
rad
(
d
)
{
return
d
*
Math
.
PI
/
180.0
;
},
/**
* 处理终点location数组
* @return 返回终点数组
*/
getEndLocation
(
location
){
var
to
=
location
.
split
(
';'
);
var
endLocation
=
[];
for
(
var
i
=
0
;
i
<
to
.
length
;
i
++
)
{
endLocation
.
push
({
lat
:
parseFloat
(
to
[
i
].
split
(
','
)[
0
]),
lng
:
parseFloat
(
to
[
i
].
split
(
','
)[
1
])
})
}
return
endLocation
;
},
/**
* 计算两点间直线距离
* @param a 表示纬度差
* @param b 表示经度差
* @return 返回的是距离,单位m
*/
getDistance
(
latFrom
,
lngFrom
,
latTo
,
lngTo
)
{
var
radLatFrom
=
this
.
rad
(
latFrom
);
var
radLatTo
=
this
.
rad
(
latTo
);
var
a
=
radLatFrom
-
radLatTo
;
var
b
=
this
.
rad
(
lngFrom
)
-
this
.
rad
(
lngTo
);
var
distance
=
2
*
Math
.
asin
(
Math
.
sqrt
(
Math
.
pow
(
Math
.
sin
(
a
/
2
),
2
)
+
Math
.
cos
(
radLatFrom
)
*
Math
.
cos
(
radLatTo
)
*
Math
.
pow
(
Math
.
sin
(
b
/
2
),
2
)));
distance
=
distance
*
EARTH_RADIUS
;
distance
=
Math
.
round
(
distance
*
10000
)
/
10000
;
return
parseFloat
(
distance
.
toFixed
(
0
));
},
/**
* 使用微信接口进行定位
*/
getWXLocation
(
success
,
fail
,
complete
)
{
wx
.
getLocation
({
type
:
'gcj02'
,
success
:
success
,
fail
:
fail
,
complete
:
complete
});
},
/**
* 获取location参数
*/
getLocationParam
(
location
)
{
if
(
typeof
location
==
'string'
)
{
var
locationArr
=
location
.
split
(
','
);
if
(
locationArr
.
length
===
2
)
{
location
=
{
latitude
:
location
.
split
(
','
)[
0
],
longitude
:
location
.
split
(
','
)[
1
]
};
}
else
{
location
=
{};
}
}
return
location
;
},
/**
* 回调函数默认处理
*/
polyfillParam
(
param
)
{
param
.
success
=
param
.
success
||
function
()
{
};
param
.
fail
=
param
.
fail
||
function
()
{
};
param
.
complete
=
param
.
complete
||
function
()
{
};
},
/**
* 验证param对应的key值是否为空
*
* @param {Object} param 接口参数
* @param {String} key 对应参数的key
*/
checkParamKeyEmpty
(
param
,
key
)
{
if
(
!
param
[
key
])
{
var
errconf
=
this
.
buildErrorConfig
(
ERROR_CONF
.
PARAM_ERR
,
ERROR_CONF
.
PARAM_ERR_MSG
+
key
+
'参数格式有误'
);
param
.
fail
(
errconf
);
param
.
complete
(
errconf
);
return
true
;
}
return
false
;
},
/**
* 验证参数中是否存在检索词keyword
*
* @param {Object} param 接口参数
*/
checkKeyword
(
param
){
return
!
this
.
checkParamKeyEmpty
(
param
,
'keyword'
);
},
/**
* 验证location值
*
* @param {Object} param 接口参数
*/
checkLocation
(
param
)
{
var
location
=
this
.
getLocationParam
(
param
.
location
);
if
(
!
location
||
!
location
.
latitude
||
!
location
.
longitude
)
{
var
errconf
=
this
.
buildErrorConfig
(
ERROR_CONF
.
PARAM_ERR
,
ERROR_CONF
.
PARAM_ERR_MSG
+
' location参数格式有误'
);
param
.
fail
(
errconf
);
param
.
complete
(
errconf
);
return
false
;
}
return
true
;
},
/**
* 构造错误数据结构
* @param {Number} errCode 错误码
* @param {Number} errMsg 错误描述
*/
buildErrorConfig
(
errCode
,
errMsg
)
{
return
{
status
:
errCode
,
message
:
errMsg
};
},
/**
*
* 数据处理函数
* 根据传入参数不同处理不同数据
* @param {String} feature 功能名称
* search 地点搜索
* suggest关键词提示
* reverseGeocoder逆地址解析
* geocoder地址解析
* getCityList获取城市列表:父集
* getDistrictByCityId获取区县列表:子集
* calculateDistance距离计算
* @param {Object} param 接口参数
* @param {Object} data 数据
*/
handleData
(
param
,
data
,
feature
){
if
(
feature
==
'search'
)
{
var
searchResult
=
data
.
data
;
var
searchSimplify
=
[];
for
(
var
i
=
0
;
i
<
searchResult
.
length
;
i
++
)
{
searchSimplify
.
push
({
id
:
searchResult
[
i
].
id
||
null
,
title
:
searchResult
[
i
].
title
||
null
,
latitude
:
searchResult
[
i
].
location
&&
searchResult
[
i
].
location
.
lat
||
null
,
longitude
:
searchResult
[
i
].
location
&&
searchResult
[
i
].
location
.
lng
||
null
,
address
:
searchResult
[
i
].
address
||
null
,
category
:
searchResult
[
i
].
category
||
null
,
tel
:
searchResult
[
i
].
tel
||
null
,
adcode
:
searchResult
[
i
].
ad_info
&&
searchResult
[
i
].
ad_info
.
adcode
||
null
,
city
:
searchResult
[
i
].
ad_info
&&
searchResult
[
i
].
ad_info
.
city
||
null
,
district
:
searchResult
[
i
].
ad_info
&&
searchResult
[
i
].
ad_info
.
district
||
null
,
province
:
searchResult
[
i
].
ad_info
&&
searchResult
[
i
].
ad_info
.
province
||
null
})
}
param
.
success
(
data
,
{
searchResult
:
searchResult
,
searchSimplify
:
searchSimplify
})
}
else
if
(
feature
==
'suggest'
)
{
var
suggestResult
=
data
.
data
;
var
suggestSimplify
=
[];
for
(
var
i
=
0
;
i
<
suggestResult
.
length
;
i
++
)
{
suggestSimplify
.
push
({
adcode
:
suggestResult
[
i
].
adcode
||
null
,
address
:
suggestResult
[
i
].
address
||
null
,
category
:
suggestResult
[
i
].
category
||
null
,
city
:
suggestResult
[
i
].
city
||
null
,
district
:
suggestResult
[
i
].
district
||
null
,
id
:
suggestResult
[
i
].
id
||
null
,
latitude
:
suggestResult
[
i
].
location
&&
suggestResult
[
i
].
location
.
lat
||
null
,
longitude
:
suggestResult
[
i
].
location
&&
suggestResult
[
i
].
location
.
lng
||
null
,
province
:
suggestResult
[
i
].
province
||
null
,
title
:
suggestResult
[
i
].
title
||
null
,
type
:
suggestResult
[
i
].
type
||
null
})
}
param
.
success
(
data
,
{
suggestResult
:
suggestResult
,
suggestSimplify
:
suggestSimplify
})
}
else
if
(
feature
==
'reverseGeocoder'
)
{
var
reverseGeocoderResult
=
data
.
result
;
var
reverseGeocoderSimplify
=
{
address
:
reverseGeocoderResult
.
address
||
null
,
latitude
:
reverseGeocoderResult
.
location
&&
reverseGeocoderResult
.
location
.
lat
||
null
,
longitude
:
reverseGeocoderResult
.
location
&&
reverseGeocoderResult
.
location
.
lng
||
null
,
adcode
:
reverseGeocoderResult
.
ad_info
&&
reverseGeocoderResult
.
ad_info
.
adcode
||
null
,
city
:
reverseGeocoderResult
.
address_component
&&
reverseGeocoderResult
.
address_component
.
city
||
null
,
district
:
reverseGeocoderResult
.
address_component
&&
reverseGeocoderResult
.
address_component
.
district
||
null
,
nation
:
reverseGeocoderResult
.
address_component
&&
reverseGeocoderResult
.
address_component
.
nation
||
null
,
province
:
reverseGeocoderResult
.
address_component
&&
reverseGeocoderResult
.
address_component
.
province
||
null
,
street
:
reverseGeocoderResult
.
address_component
&&
reverseGeocoderResult
.
address_component
.
street
||
null
,
street_number
:
reverseGeocoderResult
.
address_component
&&
reverseGeocoderResult
.
address_component
.
street_number
||
null
,
recommend
:
reverseGeocoderResult
.
formatted_addresses
&&
reverseGeocoderResult
.
formatted_addresses
.
recommend
||
null
,
rough
:
reverseGeocoderResult
.
formatted_addresses
&&
reverseGeocoderResult
.
formatted_addresses
.
rough
||
null
};
if
(
reverseGeocoderResult
.
pois
)
{
//判断是否返回周边poi
var
pois
=
reverseGeocoderResult
.
pois
;
var
poisSimplify
=
[];
for
(
var
i
=
0
;
i
<
pois
.
length
;
i
++
)
{
poisSimplify
.
push
({
id
:
pois
[
i
].
id
||
null
,
title
:
pois
[
i
].
title
||
null
,
latitude
:
pois
[
i
].
location
&&
pois
[
i
].
location
.
lat
||
null
,
longitude
:
pois
[
i
].
location
&&
pois
[
i
].
location
.
lng
||
null
,
address
:
pois
[
i
].
address
||
null
,
category
:
pois
[
i
].
category
||
null
,
adcode
:
pois
[
i
].
ad_info
&&
pois
[
i
].
ad_info
.
adcode
||
null
,
city
:
pois
[
i
].
ad_info
&&
pois
[
i
].
ad_info
.
city
||
null
,
district
:
pois
[
i
].
ad_info
&&
pois
[
i
].
ad_info
.
district
||
null
,
province
:
pois
[
i
].
ad_info
&&
pois
[
i
].
ad_info
.
province
||
null
})
}
param
.
success
(
data
,{
reverseGeocoderResult
:
reverseGeocoderResult
,
reverseGeocoderSimplify
:
reverseGeocoderSimplify
,
pois
:
pois
,
poisSimplify
:
poisSimplify
})
}
else
{
param
.
success
(
data
,
{
reverseGeocoderResult
:
reverseGeocoderResult
,
reverseGeocoderSimplify
:
reverseGeocoderSimplify
})
}
}
else
if
(
feature
==
'geocoder'
)
{
var
geocoderResult
=
data
.
result
;
var
geocoderSimplify
=
{
title
:
geocoderResult
.
title
||
null
,
latitude
:
geocoderResult
.
location
&&
geocoderResult
.
location
.
lat
||
null
,
longitude
:
geocoderResult
.
location
&&
geocoderResult
.
location
.
lng
||
null
,
adcode
:
geocoderResult
.
ad_info
&&
geocoderResult
.
ad_info
.
adcode
||
null
,
province
:
geocoderResult
.
address_components
&&
geocoderResult
.
address_components
.
province
||
null
,
city
:
geocoderResult
.
address_components
&&
geocoderResult
.
address_components
.
city
||
null
,
district
:
geocoderResult
.
address_components
&&
geocoderResult
.
address_components
.
district
||
null
,
street
:
geocoderResult
.
address_components
&&
geocoderResult
.
address_components
.
street
||
null
,
street_number
:
geocoderResult
.
address_components
&&
geocoderResult
.
address_components
.
street_number
||
null
,
level
:
geocoderResult
.
level
||
null
};
param
.
success
(
data
,{
geocoderResult
:
geocoderResult
,
geocoderSimplify
:
geocoderSimplify
});
}
else
if
(
feature
==
'getCityList'
)
{
var
provinceResult
=
data
.
result
[
0
];
var
cityResult
=
data
.
result
[
1
];
var
districtResult
=
data
.
result
[
2
];
param
.
success
(
data
,{
provinceResult
:
provinceResult
,
cityResult
:
cityResult
,
districtResult
:
districtResult
});
}
else
if
(
feature
==
'getDistrictByCityId'
)
{
var
districtByCity
=
data
.
result
[
0
];
param
.
success
(
data
,
districtByCity
);
}
else
if
(
feature
==
'calculateDistance'
)
{
var
calculateDistanceResult
=
data
.
result
.
elements
;
var
distance
=
[];
for
(
var
i
=
0
;
i
<
calculateDistanceResult
.
length
;
i
++
){
distance
.
push
(
calculateDistanceResult
[
i
].
distance
);
}
param
.
success
(
data
,
{
calculateDistanceResult
:
calculateDistanceResult
,
distance
:
distance
});
}
else
if
(
feature
==
'direction'
)
{
var
direction
=
data
.
result
.
routes
;
param
.
success
(
data
,
direction
);
}
else
{
param
.
success
(
data
);
}
},
/**
* 构造微信请求参数,公共属性处理
*
* @param {Object} param 接口参数
* @param {Object} param 配置项
* @param {String} feature 方法名
*/
buildWxRequestConfig
(
param
,
options
,
feature
)
{
var
that
=
this
;
options
.
header
=
{
"content-type"
:
"application/json"
};
options
.
method
=
'GET'
;
options
.
success
=
function
(
res
)
{
var
data
=
res
.
data
;
if
(
data
.
status
===
0
)
{
that
.
handleData
(
param
,
data
,
feature
);
}
else
{
param
.
fail
(
data
);
}
};
options
.
fail
=
function
(
res
)
{
res
.
statusCode
=
ERROR_CONF
.
WX_ERR_CODE
;
param
.
fail
(
that
.
buildErrorConfig
(
ERROR_CONF
.
WX_ERR_CODE
,
res
.
errMsg
));
};
options
.
complete
=
function
(
res
)
{
var
statusCode
=
+
res
.
statusCode
;
switch
(
statusCode
)
{
case
ERROR_CONF
.
WX_ERR_CODE
:
{
param
.
complete
(
that
.
buildErrorConfig
(
ERROR_CONF
.
WX_ERR_CODE
,
res
.
errMsg
));
break
;
}
case
ERROR_CONF
.
WX_OK_CODE
:
{
var
data
=
res
.
data
;
if
(
data
.
status
===
0
)
{
param
.
complete
(
data
);
}
else
{
param
.
complete
(
that
.
buildErrorConfig
(
data
.
status
,
data
.
message
));
}
break
;
}
default
:{
param
.
complete
(
that
.
buildErrorConfig
(
ERROR_CONF
.
SYSTEM_ERR
,
ERROR_CONF
.
SYSTEM_ERR_MSG
));
}
}
};
return
options
;
},
/**
* 处理用户参数是否传入坐标进行不同的处理
*/
locationProcess
(
param
,
locationsuccess
,
locationfail
,
locationcomplete
)
{
var
that
=
this
;
locationfail
=
locationfail
||
function
(
res
)
{
res
.
statusCode
=
ERROR_CONF
.
WX_ERR_CODE
;
param
.
fail
(
that
.
buildErrorConfig
(
ERROR_CONF
.
WX_ERR_CODE
,
res
.
errMsg
));
};
locationcomplete
=
locationcomplete
||
function
(
res
)
{
if
(
res
.
statusCode
==
ERROR_CONF
.
WX_ERR_CODE
)
{
param
.
complete
(
that
.
buildErrorConfig
(
ERROR_CONF
.
WX_ERR_CODE
,
res
.
errMsg
));
}
};
if
(
!
param
.
location
)
{
that
.
getWXLocation
(
locationsuccess
,
locationfail
,
locationcomplete
);
}
else
if
(
that
.
checkLocation
(
param
))
{
var
location
=
Utils
.
getLocationParam
(
param
.
location
);
locationsuccess
(
location
);
}
}
};
class
QQMapWX
{
/**
* 构造函数
*
* @param {Object} options 接口参数,key 为必选参数
*/
constructor
(
options
)
{
if
(
!
options
.
key
)
{
throw
Error
(
'key值不能为空'
);
}
this
.
key
=
options
.
key
;
};
/**
* POI周边检索
*
* @param {Object} options 接口参数对象
*
* 参数对象结构可以参考
* @see http://lbs.qq.com/webservice_v1/guide-search.html
*/
search
(
options
)
{
var
that
=
this
;
options
=
options
||
{};
Utils
.
polyfillParam
(
options
);
if
(
!
Utils
.
checkKeyword
(
options
))
{
return
;
}
var
requestParam
=
{
keyword
:
options
.
keyword
,
orderby
:
options
.
orderby
||
'_distance'
,
page_size
:
options
.
page_size
||
10
,
page_index
:
options
.
page_index
||
1
,
output
:
'json'
,
key
:
that
.
key
};
if
(
options
.
address_format
)
{
requestParam
.
address_format
=
options
.
address_format
;
}
if
(
options
.
filter
)
{
requestParam
.
filter
=
options
.
filter
;
}
var
distance
=
options
.
distance
||
"1000"
;
var
auto_extend
=
options
.
auto_extend
||
1
;
var
region
=
null
;
var
rectangle
=
null
;
//判断城市限定参数
if
(
options
.
region
)
{
region
=
options
.
region
;
}
//矩形限定坐标(暂时只支持字符串格式)
if
(
options
.
rectangle
)
{
rectangle
=
options
.
rectangle
;
}
var
locationsuccess
=
function
(
result
)
{
if
(
region
&&
!
rectangle
)
{
//城市限定参数拼接
requestParam
.
boundary
=
"region("
+
region
+
","
+
auto_extend
+
","
+
result
.
latitude
+
","
+
result
.
longitude
+
")"
;
if
(
options
.
sig
)
{
requestParam
.
sig
=
Utils
.
getSig
(
requestParam
,
options
.
sig
,
'search'
);
}
}
else
if
(
rectangle
&&
!
region
)
{
//矩形搜索
requestParam
.
boundary
=
"rectangle("
+
rectangle
+
")"
;
if
(
options
.
sig
)
{
requestParam
.
sig
=
Utils
.
getSig
(
requestParam
,
options
.
sig
,
'search'
);
}
}
else
{
requestParam
.
boundary
=
"nearby("
+
result
.
latitude
+
","
+
result
.
longitude
+
","
+
distance
+
","
+
auto_extend
+
")"
;
if
(
options
.
sig
)
{
requestParam
.
sig
=
Utils
.
getSig
(
requestParam
,
options
.
sig
,
'search'
);
}
}
wx
.
request
(
Utils
.
buildWxRequestConfig
(
options
,
{
url
:
URL_SEARCH
,
data
:
requestParam
},
'search'
));
};
Utils
.
locationProcess
(
options
,
locationsuccess
);
};
/**
* sug模糊检索
*
* @param {Object} options 接口参数对象
*
* 参数对象结构可以参考
* http://lbs.qq.com/webservice_v1/guide-suggestion.html
*/
getSuggestion
(
options
)
{
var
that
=
this
;
options
=
options
||
{};
Utils
.
polyfillParam
(
options
);
if
(
!
Utils
.
checkKeyword
(
options
))
{
return
;
}
var
requestParam
=
{
keyword
:
options
.
keyword
,
region
:
options
.
region
||
'全国'
,
region_fix
:
options
.
region_fix
||
0
,
policy
:
options
.
policy
||
0
,
page_size
:
options
.
page_size
||
10
,
//控制显示条数
page_index
:
options
.
page_index
||
1
,
//控制页数
get_subpois
:
options
.
get_subpois
||
0
,
//返回子地点
output
:
'json'
,
key
:
that
.
key
};
//长地址
if
(
options
.
address_format
)
{
requestParam
.
address_format
=
options
.
address_format
;
}
//过滤
if
(
options
.
filter
)
{
requestParam
.
filter
=
options
.
filter
;
}
//排序
if
(
options
.
location
)
{
var
locationsuccess
=
function
(
result
)
{
requestParam
.
location
=
result
.
latitude
+
','
+
result
.
longitude
;
if
(
options
.
sig
)
{
requestParam
.
sig
=
Utils
.
getSig
(
requestParam
,
options
.
sig
,
'suggest'
);
}
wx
.
request
(
Utils
.
buildWxRequestConfig
(
options
,
{
url
:
URL_SUGGESTION
,
data
:
requestParam
},
"suggest"
));
};
Utils
.
locationProcess
(
options
,
locationsuccess
);
}
else
{
if
(
options
.
sig
)
{
requestParam
.
sig
=
Utils
.
getSig
(
requestParam
,
options
.
sig
,
'suggest'
);
}
wx
.
request
(
Utils
.
buildWxRequestConfig
(
options
,
{
url
:
URL_SUGGESTION
,
data
:
requestParam
},
"suggest"
));
}
};
/**
* 逆地址解析
*
* @param {Object} options 接口参数对象
*
* 请求参数结构可以参考
* http://lbs.qq.com/webservice_v1/guide-gcoder.html
*/
reverseGeocoder
(
options
)
{
var
that
=
this
;
options
=
options
||
{};
Utils
.
polyfillParam
(
options
);
var
requestParam
=
{
coord_type
:
options
.
coord_type
||
5
,
get_poi
:
options
.
get_poi
||
0
,
output
:
'json'
,
key
:
that
.
key
};
if
(
options
.
poi_options
)
{
requestParam
.
poi_options
=
options
.
poi_options
}
var
locationsuccess
=
function
(
result
)
{
requestParam
.
location
=
result
.
latitude
+
','
+
result
.
longitude
;
if
(
options
.
sig
)
{
requestParam
.
sig
=
Utils
.
getSig
(
requestParam
,
options
.
sig
,
'reverseGeocoder'
);
}
wx
.
request
(
Utils
.
buildWxRequestConfig
(
options
,
{
url
:
URL_GET_GEOCODER
,
data
:
requestParam
},
'reverseGeocoder'
));
};
Utils
.
locationProcess
(
options
,
locationsuccess
);
};
/**
* 地址解析
*
* @param {Object} options 接口参数对象
*
* 请求参数结构可以参考
* http://lbs.qq.com/webservice_v1/guide-geocoder.html
*/
geocoder
(
options
)
{
var
that
=
this
;
options
=
options
||
{};
Utils
.
polyfillParam
(
options
);
if
(
Utils
.
checkParamKeyEmpty
(
options
,
'address'
))
{
return
;
}
var
requestParam
=
{
address
:
options
.
address
,
output
:
'json'
,
key
:
that
.
key
};
//城市限定
if
(
options
.
region
)
{
requestParam
.
region
=
options
.
region
;
}
if
(
options
.
sig
)
{
requestParam
.
sig
=
Utils
.
getSig
(
requestParam
,
options
.
sig
,
'geocoder'
);
}
wx
.
request
(
Utils
.
buildWxRequestConfig
(
options
,
{
url
:
URL_GET_GEOCODER
,
data
:
requestParam
},
'geocoder'
));
};
/**
* 获取城市列表
*
* @param {Object} options 接口参数对象
*
* 请求参数结构可以参考
* http://lbs.qq.com/webservice_v1/guide-region.html
*/
getCityList
(
options
)
{
var
that
=
this
;
options
=
options
||
{};
Utils
.
polyfillParam
(
options
);
var
requestParam
=
{
output
:
'json'
,
key
:
that
.
key
};
if
(
options
.
sig
)
{
requestParam
.
sig
=
Utils
.
getSig
(
requestParam
,
options
.
sig
,
'getCityList'
);
}
wx
.
request
(
Utils
.
buildWxRequestConfig
(
options
,
{
url
:
URL_CITY_LIST
,
data
:
requestParam
},
'getCityList'
));
};
/**
* 获取对应城市ID的区县列表
*
* @param {Object} options 接口参数对象
*
* 请求参数结构可以参考
* http://lbs.qq.com/webservice_v1/guide-region.html
*/
getDistrictByCityId
(
options
)
{
var
that
=
this
;
options
=
options
||
{};
Utils
.
polyfillParam
(
options
);
if
(
Utils
.
checkParamKeyEmpty
(
options
,
'id'
))
{
return
;
}
var
requestParam
=
{
id
:
options
.
id
||
''
,
output
:
'json'
,
key
:
that
.
key
};
if
(
options
.
sig
)
{
requestParam
.
sig
=
Utils
.
getSig
(
requestParam
,
options
.
sig
,
'getDistrictByCityId'
);
}
wx
.
request
(
Utils
.
buildWxRequestConfig
(
options
,
{
url
:
URL_AREA_LIST
,
data
:
requestParam
},
'getDistrictByCityId'
));
};
/**
* 用于单起点到多终点的路线距离(非直线距离)计算:
* 支持两种距离计算方式:步行和驾车。
* 起点到终点最大限制直线距离10公里。
*
* 新增直线距离计算。
*
* @param {Object} options 接口参数对象
*
* 请求参数结构可以参考
* http://lbs.qq.com/webservice_v1/guide-distance.html
*/
calculateDistance
(
options
)
{
var
that
=
this
;
options
=
options
||
{};
Utils
.
polyfillParam
(
options
);
if
(
Utils
.
checkParamKeyEmpty
(
options
,
'to'
))
{
return
;
}
var
requestParam
=
{
mode
:
options
.
mode
||
'walking'
,
to
:
Utils
.
location2query
(
options
.
to
),
output
:
'json'
,
key
:
that
.
key
};
if
(
options
.
from
)
{
options
.
location
=
options
.
from
;
}
//计算直线距离
if
(
requestParam
.
mode
==
'straight'
){
var
locationsuccess
=
function
(
result
)
{
var
locationTo
=
Utils
.
getEndLocation
(
requestParam
.
to
);
//处理终点坐标
var
data
=
{
message
:
"query ok"
,
result
:{
elements
:[]
},
status
:
0
};
for
(
var
i
=
0
;
i
<
locationTo
.
length
;
i
++
)
{
data
.
result
.
elements
.
push
({
//将坐标存入
distance
:
Utils
.
getDistance
(
result
.
latitude
,
result
.
longitude
,
locationTo
[
i
].
lat
,
locationTo
[
i
].
lng
),
duration
:
0
,
from
:{
lat
:
result
.
latitude
,
lng
:
result
.
longitude
},
to
:{
lat
:
locationTo
[
i
].
lat
,
lng
:
locationTo
[
i
].
lng
}
});
}
var
calculateResult
=
data
.
result
.
elements
;
var
distanceResult
=
[];
for
(
var
i
=
0
;
i
<
calculateResult
.
length
;
i
++
)
{
distanceResult
.
push
(
calculateResult
[
i
].
distance
);
}
return
options
.
success
(
data
,{
calculateResult
:
calculateResult
,
distanceResult
:
distanceResult
});
};
Utils
.
locationProcess
(
options
,
locationsuccess
);
}
else
{
var
locationsuccess
=
function
(
result
)
{
requestParam
.
from
=
result
.
latitude
+
','
+
result
.
longitude
;
if
(
options
.
sig
)
{
requestParam
.
sig
=
Utils
.
getSig
(
requestParam
,
options
.
sig
,
'calculateDistance'
);
}
wx
.
request
(
Utils
.
buildWxRequestConfig
(
options
,
{
url
:
URL_DISTANCE
,
data
:
requestParam
},
'calculateDistance'
));
};
Utils
.
locationProcess
(
options
,
locationsuccess
);
}
};
/**
* 路线规划:
*
* @param {Object} options 接口参数对象
*
* 请求参数结构可以参考
* https://lbs.qq.com/webservice_v1/guide-road.html
*/
direction
(
options
)
{
var
that
=
this
;
options
=
options
||
{};
Utils
.
polyfillParam
(
options
);
if
(
Utils
.
checkParamKeyEmpty
(
options
,
'to'
))
{
return
;
}
var
requestParam
=
{
output
:
'json'
,
key
:
that
.
key
};
//to格式处理
if
(
typeof
options
.
to
==
'string'
)
{
requestParam
.
to
=
options
.
to
;
}
else
{
requestParam
.
to
=
options
.
to
.
latitude
+
','
+
options
.
to
.
longitude
;
}
//初始化局部请求域名
var
SET_URL_DIRECTION
=
null
;
//设置默认mode属性
options
.
mode
=
options
.
mode
||
MODE
.
driving
;
//设置请求域名
SET_URL_DIRECTION
=
URL_DIRECTION
+
options
.
mode
;
if
(
options
.
from
)
{
options
.
location
=
options
.
from
;
}
if
(
options
.
mode
==
MODE
.
driving
)
{
if
(
options
.
from_poi
)
{
requestParam
.
from_poi
=
options
.
from_poi
;
}
if
(
options
.
heading
)
{
requestParam
.
heading
=
options
.
heading
;
}
if
(
options
.
speed
)
{
requestParam
.
speed
=
options
.
speed
;
}
if
(
options
.
accuracy
)
{
requestParam
.
accuracy
=
options
.
accuracy
;
}
if
(
options
.
road_type
)
{
requestParam
.
road_type
=
options
.
road_type
;
}
if
(
options
.
to_poi
)
{
requestParam
.
to_poi
=
options
.
to_poi
;
}
if
(
options
.
from_track
)
{
requestParam
.
from_track
=
options
.
from_track
;
}
if
(
options
.
waypoints
)
{
requestParam
.
waypoints
=
options
.
waypoints
;
}
if
(
options
.
policy
)
{
requestParam
.
policy
=
options
.
policy
;
}
if
(
options
.
plate_number
)
{
requestParam
.
plate_number
=
options
.
plate_number
;
}
}
if
(
options
.
mode
==
MODE
.
transit
)
{
if
(
options
.
departure_time
)
{
requestParam
.
departure_time
=
options
.
departure_time
;
}
if
(
options
.
policy
)
{
requestParam
.
policy
=
options
.
policy
;
}
}
var
locationsuccess
=
function
(
result
)
{
requestParam
.
from
=
result
.
latitude
+
','
+
result
.
longitude
;
if
(
options
.
sig
)
{
requestParam
.
sig
=
Utils
.
getSig
(
requestParam
,
options
.
sig
,
'direction'
,
options
.
mode
);
}
wx
.
request
(
Utils
.
buildWxRequestConfig
(
options
,
{
url
:
SET_URL_DIRECTION
,
data
:
requestParam
},
'direction'
));
};
Utils
.
locationProcess
(
options
,
locationsuccess
);
}
};
module
.
exports
=
QQMapWX
;
\ No newline at end of file
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