作者 王晓刚
1 个管道 的构建 通过 耗费 1 秒

音频

1 <?xml version="1.0" encoding="UTF-8"?> 1 <?xml version="1.0" encoding="UTF-8"?>
2 <project version="4"> 2 <project version="4">
  3 + <component name="BookmarkManager">
  4 + <bookmark url="file://$PROJECT_DIR$/application/home/view/member/my_information.html" line="116" mnemonic="4" />
  5 + </component>
3 <component name="ChangeListManager"> 6 <component name="ChangeListManager">
4 <list default="true" id="309ad746-5b2a-4c29-af46-e7925a35765c" name="默认的" comment=""> 7 <list default="true" id="309ad746-5b2a-4c29-af46-e7925a35765c" name="默认的" comment="">
  8 + <change afterPath="$PROJECT_DIR$/public/assets/advertising/js/qqmap-wx-jssdk.js" afterDir="false" />
5 <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> 9 <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
6 - <change beforePath="$PROJECT_DIR$/public/assets/advertising/css/personalMsg.css" beforeDir="false" afterPath="$PROJECT_DIR$/public/assets/advertising/css/personalMsg.css" afterDir="false" /> 10 + <change beforePath="$PROJECT_DIR$/application/home/controller/Member.php" beforeDir="false" afterPath="$PROJECT_DIR$/application/home/controller/Member.php" afterDir="false" />
  11 + <change beforePath="$PROJECT_DIR$/application/home/view/member/my_information.html" beforeDir="false" afterPath="$PROJECT_DIR$/application/home/view/member/my_information.html" afterDir="false" />
7 </list> 12 </list>
8 <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> 13 <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
9 <option name="TRACKING_ENABLED" value="true" /> 14 <option name="TRACKING_ENABLED" value="true" />
@@ -34,26 +39,17 @@ @@ -34,26 +39,17 @@
34 <file leaf-file-name="Member.php" pinned="false" current-in-tab="false"> 39 <file leaf-file-name="Member.php" pinned="false" current-in-tab="false">
35 <entry file="file://$PROJECT_DIR$/application/home/controller/Member.php"> 40 <entry file="file://$PROJECT_DIR$/application/home/controller/Member.php">
36 <provider selected="true" editor-type-id="text-editor"> 41 <provider selected="true" editor-type-id="text-editor">
37 - <state relative-caret-position="561">  
38 - <caret line="64" column="32" lean-forward="true" selection-start-line="64" selection-start-column="32" selection-end-line="64" selection-end-column="32" /> 42 + <state relative-caret-position="745">
  43 + <caret line="341" column="70" selection-start-line="341" selection-start-column="70" selection-end-line="341" selection-end-column="70" />
39 </state> 44 </state>
40 </provider> 45 </provider>
41 </entry> 46 </entry>
42 </file> 47 </file>
43 - <file leaf-file-name="my_information.html" pinned="false" current-in-tab="false"> 48 + <file leaf-file-name="my_information.html" pinned="false" current-in-tab="true">
44 <entry file="file://$PROJECT_DIR$/application/home/view/member/my_information.html"> 49 <entry file="file://$PROJECT_DIR$/application/home/view/member/my_information.html">
45 <provider selected="true" editor-type-id="text-editor"> 50 <provider selected="true" editor-type-id="text-editor">
46 - <state relative-caret-position="493">  
47 - <caret line="29" column="102" selection-start-line="29" selection-start-column="102" selection-end-line="29" selection-end-column="102" />  
48 - </state>  
49 - </provider>  
50 - </entry>  
51 - </file>  
52 - <file leaf-file-name="personalMsg.css" pinned="false" current-in-tab="true">  
53 - <entry file="file://$PROJECT_DIR$/public/assets/advertising/css/personalMsg.css">  
54 - <provider selected="true" editor-type-id="text-editor">  
55 - <state relative-caret-position="356">  
56 - <caret line="25" column="23" selection-start-line="25" selection-start-column="23" selection-end-line="25" selection-end-column="23" /> 51 + <state relative-caret-position="793">
  52 + <caret line="145" column="41" selection-start-line="145" selection-start-column="41" selection-end-line="145" selection-end-column="41" />
57 </state> 53 </state>
58 </provider> 54 </provider>
59 </entry> 55 </entry>
@@ -93,8 +89,8 @@ @@ -93,8 +89,8 @@
93 <file leaf-file-name="index.html" pinned="false" current-in-tab="false"> 89 <file leaf-file-name="index.html" pinned="false" current-in-tab="false">
94 <entry file="file://$PROJECT_DIR$/application/home/view/index/index.html"> 90 <entry file="file://$PROJECT_DIR$/application/home/view/index/index.html">
95 <provider selected="true" editor-type-id="text-editor"> 91 <provider selected="true" editor-type-id="text-editor">
96 - <state relative-caret-position="266">  
97 - <caret line="73" selection-start-line="73" selection-end-line="73" selection-end-column="28" /> 92 + <state relative-caret-position="181">
  93 + <caret line="74" column="67" selection-start-line="74" selection-start-column="67" selection-end-line="74" selection-end-column="67" />
98 </state> 94 </state>
99 </provider> 95 </provider>
100 </entry> 96 </entry>
@@ -110,7 +106,6 @@ @@ -110,7 +106,6 @@
110 </component> 106 </component>
111 <component name="FindInProjectRecents"> 107 <component name="FindInProjectRecents">
112 <findStrings> 108 <findStrings>
113 - <find>btn_all</find>  
114 <find>btn_msg</find> 109 <find>btn_msg</find>
115 <find>new_time</find> 110 <find>new_time</find>
116 <find>is_where_satisfy</find> 111 <find>is_where_satisfy</find>
@@ -140,6 +135,7 @@ @@ -140,6 +135,7 @@
140 <find>b_active</find> 135 <find>b_active</find>
141 <find>quest_box</find> 136 <find>quest_box</find>
142 <find>.head_img</find> 137 <find>.head_img</find>
  138 + <find>header_img</find>
143 </findStrings> 139 </findStrings>
144 <replaceStrings> 140 <replaceStrings>
145 <replace /> 141 <replace />
@@ -185,7 +181,6 @@ @@ -185,7 +181,6 @@
185 <option value="$PROJECT_DIR$/application/home/controller/User.php" /> 181 <option value="$PROJECT_DIR$/application/home/controller/User.php" />
186 <option value="$PROJECT_DIR$/application/home/controller/Question.php" /> 182 <option value="$PROJECT_DIR$/application/home/controller/Question.php" />
187 <option value="$PROJECT_DIR$/application/home/controller/Index.php" /> 183 <option value="$PROJECT_DIR$/application/home/controller/Index.php" />
188 - <option value="$PROJECT_DIR$/application/home/view/index/index.html" />  
189 <option value="$PROJECT_DIR$/public/assets/advertising/css/public.css" /> 184 <option value="$PROJECT_DIR$/public/assets/advertising/css/public.css" />
190 <option value="$PROJECT_DIR$/application/database.php" /> 185 <option value="$PROJECT_DIR$/application/database.php" />
191 <option value="$PROJECT_DIR$/application/home/view/public/js.html" /> 186 <option value="$PROJECT_DIR$/application/home/view/public/js.html" />
@@ -199,9 +194,10 @@ @@ -199,9 +194,10 @@
199 <option value="$PROJECT_DIR$/application/home/controller/Merchant.php" /> 194 <option value="$PROJECT_DIR$/application/home/controller/Merchant.php" />
200 <option value="$PROJECT_DIR$/application/home/view/goods/video_detail.html" /> 195 <option value="$PROJECT_DIR$/application/home/view/goods/video_detail.html" />
201 <option value="$PROJECT_DIR$/application/home/view/member/index.html" /> 196 <option value="$PROJECT_DIR$/application/home/view/member/index.html" />
  197 + <option value="$PROJECT_DIR$/public/assets/advertising/css/personalMsg.css" />
202 <option value="$PROJECT_DIR$/application/home/controller/Member.php" /> 198 <option value="$PROJECT_DIR$/application/home/controller/Member.php" />
  199 + <option value="$PROJECT_DIR$/application/home/view/index/index.html" />
203 <option value="$PROJECT_DIR$/application/home/view/member/my_information.html" /> 200 <option value="$PROJECT_DIR$/application/home/view/member/my_information.html" />
204 - <option value="$PROJECT_DIR$/public/assets/advertising/css/personalMsg.css" />  
205 </list> 201 </list>
206 </option> 202 </option>
207 </component> 203 </component>
@@ -366,6 +362,14 @@ @@ -366,6 +362,14 @@
366 <item name="advertising" type="462c0819:PsiDirectoryNode" /> 362 <item name="advertising" type="462c0819:PsiDirectoryNode" />
367 <item name="css" type="462c0819:PsiDirectoryNode" /> 363 <item name="css" type="462c0819:PsiDirectoryNode" />
368 </path> 364 </path>
  365 + <path>
  366 + <item name="advertising" type="b2602c69:ProjectViewProjectNode" />
  367 + <item name="advertising" type="462c0819:PsiDirectoryNode" />
  368 + <item name="public" type="462c0819:PsiDirectoryNode" />
  369 + <item name="assets" type="462c0819:PsiDirectoryNode" />
  370 + <item name="advertising" type="462c0819:PsiDirectoryNode" />
  371 + <item name="js" type="462c0819:PsiDirectoryNode" />
  372 + </path>
369 </expand> 373 </expand>
370 <select /> 374 <select />
371 </subPane> 375 </subPane>
@@ -388,8 +392,8 @@ @@ -388,8 +392,8 @@
388 </component> 392 </component>
389 <component name="RecentsManager"> 393 <component name="RecentsManager">
390 <key name="CopyFile.RECENT_KEYS"> 394 <key name="CopyFile.RECENT_KEYS">
391 - <recent name="D:\wamp\www\advertising\application\home\view\member" />  
392 <recent name="D:\wamp\www\advertising\public\assets\advertising\js" /> 395 <recent name="D:\wamp\www\advertising\public\assets\advertising\js" />
  396 + <recent name="D:\wamp\www\advertising\application\home\view\member" />
393 <recent name="D:\wamp\www\advertising\public\assets\advertising\css" /> 397 <recent name="D:\wamp\www\advertising\public\assets\advertising\css" />
394 <recent name="D:\wamp\www\advertising\application\home\view\goods" /> 398 <recent name="D:\wamp\www\advertising\application\home\view\goods" />
395 <recent name="D:\wamp\www\advertising\application\home\view\user" /> 399 <recent name="D:\wamp\www\advertising\application\home\view\user" />
@@ -439,28 +443,7 @@ @@ -439,28 +443,7 @@
439 <workItem from="1572568391799" duration="24440000" /> 443 <workItem from="1572568391799" duration="24440000" />
440 <workItem from="1572668245063" duration="699000" /> 444 <workItem from="1572668245063" duration="699000" />
441 <workItem from="1572827640492" duration="25475000" /> 445 <workItem from="1572827640492" duration="25475000" />
442 - <workItem from="1572914713443" duration="20959000" />  
443 - </task>  
444 - <task id="LOCAL-00152" summary="视频详情">  
445 - <created>1572923759714</created>  
446 - <option name="number" value="00152" />  
447 - <option name="presentableId" value="LOCAL-00152" />  
448 - <option name="project" value="LOCAL" />  
449 - <updated>1572923759715</updated>  
450 - </task>  
451 - <task id="LOCAL-00153" summary="视频详情">  
452 - <created>1572923840872</created>  
453 - <option name="number" value="00153" />  
454 - <option name="presentableId" value="LOCAL-00153" />  
455 - <option name="project" value="LOCAL" />  
456 - <updated>1572923840872</updated>  
457 - </task>  
458 - <task id="LOCAL-00154" summary="视频详情">  
459 - <created>1572923986177</created>  
460 - <option name="number" value="00154" />  
461 - <option name="presentableId" value="LOCAL-00154" />  
462 - <option name="project" value="LOCAL" />  
463 - <updated>1572923986177</updated> 446 + <workItem from="1572914713443" duration="22644000" />
464 </task> 447 </task>
465 <task id="LOCAL-00155" summary="视频详情"> 448 <task id="LOCAL-00155" summary="视频详情">
466 <created>1572924115829</created> 449 <created>1572924115829</created>
@@ -784,11 +767,32 @@ @@ -784,11 +767,32 @@
784 <option name="project" value="LOCAL" /> 767 <option name="project" value="LOCAL" />
785 <updated>1572941029824</updated> 768 <updated>1572941029824</updated>
786 </task> 769 </task>
787 - <option name="localTasksCounter" value="201" /> 770 + <task id="LOCAL-00201" summary="音频">
  771 + <created>1572941081046</created>
  772 + <option name="number" value="00201" />
  773 + <option name="presentableId" value="LOCAL-00201" />
  774 + <option name="project" value="LOCAL" />
  775 + <updated>1572941081046</updated>
  776 + </task>
  777 + <task id="LOCAL-00202" summary="音频">
  778 + <created>1572941292693</created>
  779 + <option name="number" value="00202" />
  780 + <option name="presentableId" value="LOCAL-00202" />
  781 + <option name="project" value="LOCAL" />
  782 + <updated>1572941292693</updated>
  783 + </task>
  784 + <task id="LOCAL-00203" summary="音频">
  785 + <created>1572941505447</created>
  786 + <option name="number" value="00203" />
  787 + <option name="presentableId" value="LOCAL-00203" />
  788 + <option name="project" value="LOCAL" />
  789 + <updated>1572941505448</updated>
  790 + </task>
  791 + <option name="localTasksCounter" value="204" />
788 <servers /> 792 <servers />
789 </component> 793 </component>
790 <component name="TimeTrackingManager"> 794 <component name="TimeTrackingManager">
791 - <option name="totallyTimeSpent" value="320537000" /> 795 + <option name="totallyTimeSpent" value="322222000" />
792 </component> 796 </component>
793 <component name="ToolWindowManager"> 797 <component name="ToolWindowManager">
794 <frame x="-8" y="-8" width="1936" height="1056" extended-state="6" /> 798 <frame x="-8" y="-8" width="1936" height="1056" extended-state="6" />
@@ -867,13 +871,6 @@ @@ -867,13 +871,6 @@
867 <option name="LAST_COMMIT_MESSAGE" value="音频" /> 871 <option name="LAST_COMMIT_MESSAGE" value="音频" />
868 </component> 872 </component>
869 <component name="editorHistoryManager"> 873 <component name="editorHistoryManager">
870 - <entry file="file://$PROJECT_DIR$/application/extra/wechat.php">  
871 - <provider selected="true" editor-type-id="text-editor">  
872 - <state relative-caret-position="709">  
873 - <caret line="64" column="24" selection-start-line="64" selection-start-column="24" selection-end-line="64" selection-end-column="24" />  
874 - </state>  
875 - </provider>  
876 - </entry>  
877 <entry file="file://$PROJECT_DIR$/application/admin/controller/Pay.php"> 874 <entry file="file://$PROJECT_DIR$/application/admin/controller/Pay.php">
878 <provider selected="true" editor-type-id="text-editor"> 875 <provider selected="true" editor-type-id="text-editor">
879 <state relative-caret-position="425"> 876 <state relative-caret-position="425">
@@ -1128,13 +1125,6 @@ @@ -1128,13 +1125,6 @@
1128 </state> 1125 </state>
1129 </provider> 1126 </provider>
1130 </entry> 1127 </entry>
1131 - <entry file="file://$PROJECT_DIR$/application/home/view/index/index.html">  
1132 - <provider selected="true" editor-type-id="text-editor">  
1133 - <state relative-caret-position="266">  
1134 - <caret line="73" selection-start-line="73" selection-end-line="73" selection-end-column="28" />  
1135 - </state>  
1136 - </provider>  
1137 - </entry>  
1138 <entry file="file://$PROJECT_DIR$/public/assets/advertising/css/personal.css"> 1128 <entry file="file://$PROJECT_DIR$/public/assets/advertising/css/personal.css">
1139 <provider selected="true" editor-type-id="text-editor"> 1129 <provider selected="true" editor-type-id="text-editor">
1140 <state relative-caret-position="407"> 1130 <state relative-caret-position="407">
@@ -1173,13 +1163,6 @@ @@ -1173,13 +1163,6 @@
1173 <entry file="file://$PROJECT_DIR$/application/home/controller/Server.php"> 1163 <entry file="file://$PROJECT_DIR$/application/home/controller/Server.php">
1174 <provider selected="true" editor-type-id="text-editor" /> 1164 <provider selected="true" editor-type-id="text-editor" />
1175 </entry> 1165 </entry>
1176 - <entry file="file://$PROJECT_DIR$/application/home/view/member/index.html">  
1177 - <provider selected="true" editor-type-id="text-editor">  
1178 - <state relative-caret-position="691">  
1179 - <caret line="120" column="32" selection-start-line="120" selection-start-column="32" selection-end-line="120" selection-end-column="32" />  
1180 - </state>  
1181 - </provider>  
1182 - </entry>  
1183 <entry file="file://$PROJECT_DIR$/application/home/controller/Goods.php"> 1166 <entry file="file://$PROJECT_DIR$/application/home/controller/Goods.php">
1184 <provider selected="true" editor-type-id="text-editor"> 1167 <provider selected="true" editor-type-id="text-editor">
1185 <state relative-caret-position="460"> 1168 <state relative-caret-position="460">
@@ -1199,24 +1182,41 @@ @@ -1199,24 +1182,41 @@
1199 </state> 1182 </state>
1200 </provider> 1183 </provider>
1201 </entry> 1184 </entry>
  1185 + <entry file="file://$PROJECT_DIR$/public/assets/advertising/css/personalMsg.css">
  1186 + <provider selected="true" editor-type-id="text-editor">
  1187 + <state relative-caret-position="-52">
  1188 + <caret line="25" column="23" selection-start-line="25" selection-start-column="23" selection-end-line="25" selection-end-column="23" />
  1189 + </state>
  1190 + </provider>
  1191 + </entry>
  1192 + <entry file="file://$PROJECT_DIR$/public/assets/advertising/js/qqmap-wx-jssdk.js">
  1193 + <provider selected="true" editor-type-id="text-editor" />
  1194 + </entry>
1202 <entry file="file://$PROJECT_DIR$/application/home/controller/Member.php"> 1195 <entry file="file://$PROJECT_DIR$/application/home/controller/Member.php">
1203 <provider selected="true" editor-type-id="text-editor"> 1196 <provider selected="true" editor-type-id="text-editor">
1204 - <state relative-caret-position="561">  
1205 - <caret line="64" column="32" lean-forward="true" selection-start-line="64" selection-start-column="32" selection-end-line="64" selection-end-column="32" /> 1197 + <state relative-caret-position="745">
  1198 + <caret line="341" column="70" selection-start-line="341" selection-start-column="70" selection-end-line="341" selection-end-column="70" />
1206 </state> 1199 </state>
1207 </provider> 1200 </provider>
1208 </entry> 1201 </entry>
1209 - <entry file="file://$PROJECT_DIR$/application/home/view/member/my_information.html"> 1202 + <entry file="file://$PROJECT_DIR$/application/home/view/index/index.html">
1210 <provider selected="true" editor-type-id="text-editor"> 1203 <provider selected="true" editor-type-id="text-editor">
1211 - <state relative-caret-position="493">  
1212 - <caret line="29" column="102" selection-start-line="29" selection-start-column="102" selection-end-line="29" selection-end-column="102" /> 1204 + <state relative-caret-position="181">
  1205 + <caret line="74" column="67" selection-start-line="74" selection-start-column="67" selection-end-line="74" selection-end-column="67" />
1213 </state> 1206 </state>
1214 </provider> 1207 </provider>
1215 </entry> 1208 </entry>
1216 - <entry file="file://$PROJECT_DIR$/public/assets/advertising/css/personalMsg.css"> 1209 + <entry file="file://$PROJECT_DIR$/application/home/view/member/index.html">
1217 <provider selected="true" editor-type-id="text-editor"> 1210 <provider selected="true" editor-type-id="text-editor">
1218 - <state relative-caret-position="356">  
1219 - <caret line="25" column="23" selection-start-line="25" selection-start-column="23" selection-end-line="25" selection-end-column="23" /> 1211 + <state relative-caret-position="691">
  1212 + <caret line="120" column="32" selection-start-line="120" selection-start-column="32" selection-end-line="120" selection-end-column="32" />
  1213 + </state>
  1214 + </provider>
  1215 + </entry>
  1216 + <entry file="file://$PROJECT_DIR$/application/home/view/member/my_information.html">
  1217 + <provider selected="true" editor-type-id="text-editor">
  1218 + <state relative-caret-position="793">
  1219 + <caret line="145" column="41" selection-start-line="145" selection-start-column="41" selection-end-line="145" selection-end-column="41" />
1220 </state> 1220 </state>
1221 </provider> 1221 </provider>
1222 </entry> 1222 </entry>
@@ -338,4 +338,7 @@ class Member extends WechatBase @@ -338,4 +338,7 @@ class Member extends WechatBase
338 } 338 }
339 $this->success('success'); 339 $this->success('success');
340 } 340 }
  341 + public function getCity(){
  342 + $url = "https://restapi.amap.com/v3/geocode/regeo?parameters";
  343 + }
341 } 344 }
@@ -64,6 +64,7 @@ @@ -64,6 +64,7 @@
64 {include file="public/js" /} 64 {include file="public/js" /}
65 <script src="__CDN__/assets/advertising/mui/mui.min.js"></script> 65 <script src="__CDN__/assets/advertising/mui/mui.min.js"></script>
66 <script src="__CDN__/assets/advertising/mui/mui.picker.min.js"></script> 66 <script src="__CDN__/assets/advertising/mui/mui.picker.min.js"></script>
  67 + <script src="__CDN__/assets/advertising/js/qqmap-wx-jssdk.js"></script>
67 <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script> 68 <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
68 <script> 69 <script>
69 $(function(){ 70 $(function(){
@@ -129,32 +130,20 @@ @@ -129,32 +130,20 @@
129 alert('必须同意授权获取地理位置才能获得奖励哦'); 130 alert('必须同意授权获取地理位置才能获得奖励哦');
130 } 131 }
131 }); 132 });
132 - wx.openLocation({  
133 - latitude: 23.099994,  
134 - longitude: 113.324520,  
135 - name: 'TIT 创意园',  
136 - address: '广州市海珠区新港中路 397 号',  
137 - scale: 14,  
138 - infoUrl: 'http://weixin.qq.com'  
139 - });  
140 }); 133 });
141 function success(data) { 134 function success(data) {
142 lat = data.latitude; //经度 135 lat = data.latitude; //经度
143 lng = data.longitude; //纬度 136 lng = data.longitude; //纬度
144 - //保存到用户表  
145 - $.ajax({  
146 - url:"{:url('home/user/location')}",  
147 - type:"POST",  
148 - data:{'user_id':user_id,'longitude':lng,'latitude':lat},  
149 - success:function(res){  
150 - if(res.code == 1){  
151 - toast('定位成功');  
152 - }else{  
153 - toast('定位失败');  
154 - } 137 + var qqmapsdk = new QQMapWX({
  138 + key: 'PWEBZ-YJVWK-KAYJ2-ATH6Y-I7D35-GZFGU' //这里自己的key秘钥进行填充
  139 + });
  140 + qqmapsdk.reverseGeocoder({
  141 + location: {
  142 + latitude: lat,
  143 + longitude: lng
155 }, 144 },
156 - error:function(res){  
157 - toast('与服务器断开连接') 145 + success: function(res) {
  146 + console.log(res);
158 } 147 }
159 }); 148 });
160 } 149 }
  1 +/**
  2 + * 微信小程序JavaScriptSDK
  3 + *
  4 + * @version 1.2
  5 + * @date 2019-03-06
  6 + * @author v_ylyue@tencent.com
  7 + */
  8 +
  9 +var ERROR_CONF = {
  10 + KEY_ERR: 311,
  11 + KEY_ERR_MSG: 'key格式错误',
  12 + PARAM_ERR: 310,
  13 + PARAM_ERR_MSG: '请求参数信息有误',
  14 + SYSTEM_ERR: 600,
  15 + SYSTEM_ERR_MSG: '系统错误',
  16 + WX_ERR_CODE: 1000,
  17 + WX_OK_CODE: 200
  18 +};
  19 +var BASE_URL = 'https://apis.map.qq.com/ws/';
  20 +var URL_SEARCH = BASE_URL + 'place/v1/search';
  21 +var URL_SUGGESTION = BASE_URL + 'place/v1/suggestion';
  22 +var URL_GET_GEOCODER = BASE_URL + 'geocoder/v1/';
  23 +var URL_CITY_LIST = BASE_URL + 'district/v1/list';
  24 +var URL_AREA_LIST = BASE_URL + 'district/v1/getchildren';
  25 +var URL_DISTANCE = BASE_URL + 'distance/v1/';
  26 +var URL_DIRECTION = BASE_URL + 'direction/v1/';
  27 +var MODE = {
  28 + driving: 'driving',
  29 + transit: 'transit'
  30 +};
  31 +var EARTH_RADIUS = 6378136.49;
  32 +var Utils = {
  33 + /**
  34 + * md5加密方法
  35 + * 版权所有©2011 Sebastian Tschan,https://blueimp.net
  36 + */
  37 + safeAdd(x, y) {
  38 + var lsw = (x & 0xffff) + (y & 0xffff);
  39 + var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  40 + return (msw << 16) | (lsw & 0xffff);
  41 + },
  42 + bitRotateLeft(num, cnt) {
  43 + return (num << cnt) | (num >>> (32 - cnt));
  44 + },
  45 + md5cmn(q, a, b, x, s, t) {
  46 + return this.safeAdd(this.bitRotateLeft(this.safeAdd(this.safeAdd(a, q), this.safeAdd(x, t)), s), b);
  47 + },
  48 + md5ff(a, b, c, d, x, s, t) {
  49 + return this.md5cmn((b & c) | (~b & d), a, b, x, s, t);
  50 + },
  51 + md5gg(a, b, c, d, x, s, t) {
  52 + return this.md5cmn((b & d) | (c & ~d), a, b, x, s, t);
  53 + },
  54 + md5hh(a, b, c, d, x, s, t) {
  55 + return this.md5cmn(b ^ c ^ d, a, b, x, s, t);
  56 + },
  57 + md5ii(a, b, c, d, x, s, t) {
  58 + return this.md5cmn(c ^ (b | ~d), a, b, x, s, t);
  59 + },
  60 + binlMD5(x, len) {
  61 + /* append padding */
  62 + x[len >> 5] |= 0x80 << (len % 32);
  63 + x[((len + 64) >>> 9 << 4) + 14] = len;
  64 +
  65 + var i;
  66 + var olda;
  67 + var oldb;
  68 + var oldc;
  69 + var oldd;
  70 + var a = 1732584193;
  71 + var b = -271733879;
  72 + var c = -1732584194;
  73 + var d = 271733878;
  74 +
  75 + for (i = 0; i < x.length; i += 16) {
  76 + olda = a;
  77 + oldb = b;
  78 + oldc = c;
  79 + oldd = d;
  80 +
  81 + a = this.md5ff(a, b, c, d, x[i], 7, -680876936);
  82 + d = this.md5ff(d, a, b, c, x[i + 1], 12, -389564586);
  83 + c = this.md5ff(c, d, a, b, x[i + 2], 17, 606105819);
  84 + b = this.md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
  85 + a = this.md5ff(a, b, c, d, x[i + 4], 7, -176418897);
  86 + d = this.md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
  87 + c = this.md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
  88 + b = this.md5ff(b, c, d, a, x[i + 7], 22, -45705983);
  89 + a = this.md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
  90 + d = this.md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
  91 + c = this.md5ff(c, d, a, b, x[i + 10], 17, -42063);
  92 + b = this.md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
  93 + a = this.md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
  94 + d = this.md5ff(d, a, b, c, x[i + 13], 12, -40341101);
  95 + c = this.md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
  96 + b = this.md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
  97 +
  98 + a = this.md5gg(a, b, c, d, x[i + 1], 5, -165796510);
  99 + d = this.md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
  100 + c = this.md5gg(c, d, a, b, x[i + 11], 14, 643717713);
  101 + b = this.md5gg(b, c, d, a, x[i], 20, -373897302);
  102 + a = this.md5gg(a, b, c, d, x[i + 5], 5, -701558691);
  103 + d = this.md5gg(d, a, b, c, x[i + 10], 9, 38016083);
  104 + c = this.md5gg(c, d, a, b, x[i + 15], 14, -660478335);
  105 + b = this.md5gg(b, c, d, a, x[i + 4], 20, -405537848);
  106 + a = this.md5gg(a, b, c, d, x[i + 9], 5, 568446438);
  107 + d = this.md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
  108 + c = this.md5gg(c, d, a, b, x[i + 3], 14, -187363961);
  109 + b = this.md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
  110 + a = this.md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
  111 + d = this.md5gg(d, a, b, c, x[i + 2], 9, -51403784);
  112 + c = this.md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
  113 + b = this.md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
  114 +
  115 + a = this.md5hh(a, b, c, d, x[i + 5], 4, -378558);
  116 + d = this.md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
  117 + c = this.md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
  118 + b = this.md5hh(b, c, d, a, x[i + 14], 23, -35309556);
  119 + a = this.md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
  120 + d = this.md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
  121 + c = this.md5hh(c, d, a, b, x[i + 7], 16, -155497632);
  122 + b = this.md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
  123 + a = this.md5hh(a, b, c, d, x[i + 13], 4, 681279174);
  124 + d = this.md5hh(d, a, b, c, x[i], 11, -358537222);
  125 + c = this.md5hh(c, d, a, b, x[i + 3], 16, -722521979);
  126 + b = this.md5hh(b, c, d, a, x[i + 6], 23, 76029189);
  127 + a = this.md5hh(a, b, c, d, x[i + 9], 4, -640364487);
  128 + d = this.md5hh(d, a, b, c, x[i + 12], 11, -421815835);
  129 + c = this.md5hh(c, d, a, b, x[i + 15], 16, 530742520);
  130 + b = this.md5hh(b, c, d, a, x[i + 2], 23, -995338651);
  131 +
  132 + a = this.md5ii(a, b, c, d, x[i], 6, -198630844);
  133 + d = this.md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
  134 + c = this.md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
  135 + b = this.md5ii(b, c, d, a, x[i + 5], 21, -57434055);
  136 + a = this.md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
  137 + d = this.md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
  138 + c = this.md5ii(c, d, a, b, x[i + 10], 15, -1051523);
  139 + b = this.md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
  140 + a = this.md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
  141 + d = this.md5ii(d, a, b, c, x[i + 15], 10, -30611744);
  142 + c = this.md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
  143 + b = this.md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
  144 + a = this.md5ii(a, b, c, d, x[i + 4], 6, -145523070);
  145 + d = this.md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
  146 + c = this.md5ii(c, d, a, b, x[i + 2], 15, 718787259);
  147 + b = this.md5ii(b, c, d, a, x[i + 9], 21, -343485551);
  148 +
  149 + a = this.safeAdd(a, olda);
  150 + b = this.safeAdd(b, oldb);
  151 + c = this.safeAdd(c, oldc);
  152 + d = this.safeAdd(d, oldd);
  153 + }
  154 + return [a, b, c, d];
  155 + },
  156 + binl2rstr(input) {
  157 + var i;
  158 + var output = '';
  159 + var length32 = input.length * 32;
  160 + for (i = 0; i < length32; i += 8) {
  161 + output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);
  162 + }
  163 + return output;
  164 + },
  165 + rstr2binl(input) {
  166 + var i;
  167 + var output = [];
  168 + output[(input.length >> 2) - 1] = undefined;
  169 + for (i = 0; i < output.length; i += 1) {
  170 + output[i] = 0;
  171 + }
  172 + var length8 = input.length * 8;
  173 + for (i = 0; i < length8; i += 8) {
  174 + output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);
  175 + }
  176 + return output;
  177 + },
  178 + rstrMD5(s) {
  179 + return this.binl2rstr(this.binlMD5(this.rstr2binl(s), s.length * 8));
  180 + },
  181 + rstrHMACMD5(key, data) {
  182 + var i;
  183 + var bkey = this.rstr2binl(key);
  184 + var ipad = [];
  185 + var opad = [];
  186 + var hash;
  187 + ipad[15] = opad[15] = undefined;
  188 + if (bkey.length > 16) {
  189 + bkey = this.binlMD5(bkey, key.length * 8);
  190 + }
  191 + for (i = 0; i < 16; i += 1) {
  192 + ipad[i] = bkey[i] ^ 0x36363636;
  193 + opad[i] = bkey[i] ^ 0x5c5c5c5c;
  194 + }
  195 + hash = this.binlMD5(ipad.concat(this.rstr2binl(data)), 512 + data.length * 8);
  196 + return this.binl2rstr(this.binlMD5(opad.concat(hash), 512 + 128));
  197 + },
  198 + rstr2hex(input) {
  199 + var hexTab = '0123456789abcdef';
  200 + var output = '';
  201 + var x;
  202 + var i;
  203 + for (i = 0; i < input.length; i += 1) {
  204 + x = input.charCodeAt(i);
  205 + output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);
  206 + }
  207 + return output;
  208 + },
  209 + str2rstrUTF8(input) {
  210 + return unescape(encodeURIComponent(input));
  211 + },
  212 + rawMD5(s) {
  213 + return this.rstrMD5(this.str2rstrUTF8(s));
  214 + },
  215 + hexMD5(s) {
  216 + return this.rstr2hex(this.rawMD5(s));
  217 + },
  218 + rawHMACMD5(k, d) {
  219 + return this.rstrHMACMD5(this.str2rstrUTF8(k), str2rstrUTF8(d));
  220 + },
  221 + hexHMACMD5(k, d) {
  222 + return this.rstr2hex(this.rawHMACMD5(k, d));
  223 + },
  224 +
  225 + md5(string, key, raw) {
  226 + if (!key) {
  227 + if (!raw) {
  228 + return this.hexMD5(string);
  229 + }
  230 + return this.rawMD5(string);
  231 + }
  232 + if (!raw) {
  233 + return this.hexHMACMD5(key, string);
  234 + }
  235 + return this.rawHMACMD5(key, string);
  236 + },
  237 + /**
  238 + * 得到md5加密后的sig参数
  239 + * @param {Object} requestParam 接口参数
  240 + * @param {String} sk签名字符串
  241 + * @param {String} featrue 方法名
  242 + * @return 返回加密后的sig参数
  243 + */
  244 + getSig(requestParam, sk, feature, mode) {
  245 + var sig = null;
  246 + var requestArr = [];
  247 + Object.keys(requestParam).sort().forEach(function(key){
  248 + requestArr.push(key + '=' + requestParam[key]);
  249 + });
  250 + if (feature == 'search') {
  251 + sig = '/ws/place/v1/search?' + requestArr.join('&') + sk;
  252 + }
  253 + if (feature == 'suggest') {
  254 + sig = '/ws/place/v1/suggestion?' + requestArr.join('&') + sk;
  255 + }
  256 + if (feature == 'reverseGeocoder') {
  257 + sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk;
  258 + }
  259 + if (feature == 'geocoder') {
  260 + sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk;
  261 + }
  262 + if (feature == 'getCityList') {
  263 + sig = '/ws/district/v1/list?' + requestArr.join('&') + sk;
  264 + }
  265 + if (feature == 'getDistrictByCityId') {
  266 + sig = '/ws/district/v1/getchildren?' + requestArr.join('&') + sk;
  267 + }
  268 + if (feature == 'calculateDistance') {
  269 + sig = '/ws/distance/v1/?' + requestArr.join('&') + sk;
  270 + }
  271 + if (feature == 'direction') {
  272 + sig = '/ws/direction/v1/' + mode + '?' + requestArr.join('&') + sk;
  273 + }
  274 + sig = this.md5(sig);
  275 + return sig;
  276 + },
  277 + /**
  278 + * 得到终点query字符串
  279 + * @param {Array|String} 检索数据
  280 + */
  281 + location2query(data) {
  282 + if (typeof data == 'string') {
  283 + return data;
  284 + }
  285 + var query = '';
  286 + for (var i = 0; i < data.length; i++) {
  287 + var d = data[i];
  288 + if (!!query) {
  289 + query += ';';
  290 + }
  291 + if (d.location) {
  292 + query = query + d.location.lat + ',' + d.location.lng;
  293 + }
  294 + if (d.latitude && d.longitude) {
  295 + query = query + d.latitude + ',' + d.longitude;
  296 + }
  297 + }
  298 + return query;
  299 + },
  300 +
  301 + /**
  302 + * 计算角度
  303 + */
  304 + rad(d) {
  305 + return d * Math.PI / 180.0;
  306 + },
  307 + /**
  308 + * 处理终点location数组
  309 + * @return 返回终点数组
  310 + */
  311 + getEndLocation(location){
  312 + var to = location.split(';');
  313 + var endLocation = [];
  314 + for (var i = 0; i < to.length; i++) {
  315 + endLocation.push({
  316 + lat: parseFloat(to[i].split(',')[0]),
  317 + lng: parseFloat(to[i].split(',')[1])
  318 + })
  319 + }
  320 + return endLocation;
  321 + },
  322 +
  323 + /**
  324 + * 计算两点间直线距离
  325 + * @param a 表示纬度差
  326 + * @param b 表示经度差
  327 + * @return 返回的是距离,单位m
  328 + */
  329 + getDistance(latFrom, lngFrom, latTo, lngTo) {
  330 + var radLatFrom = this.rad(latFrom);
  331 + var radLatTo = this.rad(latTo);
  332 + var a = radLatFrom - radLatTo;
  333 + var b = this.rad(lngFrom) - this.rad(lngTo);
  334 + 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)));
  335 + distance = distance * EARTH_RADIUS;
  336 + distance = Math.round(distance * 10000) / 10000;
  337 + return parseFloat(distance.toFixed(0));
  338 + },
  339 + /**
  340 + * 使用微信接口进行定位
  341 + */
  342 + getWXLocation(success, fail, complete) {
  343 + wx.getLocation({
  344 + type: 'gcj02',
  345 + success: success,
  346 + fail: fail,
  347 + complete: complete
  348 + });
  349 + },
  350 +
  351 + /**
  352 + * 获取location参数
  353 + */
  354 + getLocationParam(location) {
  355 + if (typeof location == 'string') {
  356 + var locationArr = location.split(',');
  357 + if (locationArr.length === 2) {
  358 + location = {
  359 + latitude: location.split(',')[0],
  360 + longitude: location.split(',')[1]
  361 + };
  362 + } else {
  363 + location = {};
  364 + }
  365 + }
  366 + return location;
  367 + },
  368 +
  369 + /**
  370 + * 回调函数默认处理
  371 + */
  372 + polyfillParam(param) {
  373 + param.success = param.success || function () { };
  374 + param.fail = param.fail || function () { };
  375 + param.complete = param.complete || function () { };
  376 + },
  377 +
  378 + /**
  379 + * 验证param对应的key值是否为空
  380 + *
  381 + * @param {Object} param 接口参数
  382 + * @param {String} key 对应参数的key
  383 + */
  384 + checkParamKeyEmpty(param, key) {
  385 + if (!param[key]) {
  386 + var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + key +'参数格式有误');
  387 + param.fail(errconf);
  388 + param.complete(errconf);
  389 + return true;
  390 + }
  391 + return false;
  392 + },
  393 +
  394 + /**
  395 + * 验证参数中是否存在检索词keyword
  396 + *
  397 + * @param {Object} param 接口参数
  398 + */
  399 + checkKeyword(param){
  400 + return !this.checkParamKeyEmpty(param, 'keyword');
  401 + },
  402 +
  403 + /**
  404 + * 验证location值
  405 + *
  406 + * @param {Object} param 接口参数
  407 + */
  408 + checkLocation(param) {
  409 + var location = this.getLocationParam(param.location);
  410 + if (!location || !location.latitude || !location.longitude) {
  411 + var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + ' location参数格式有误');
  412 + param.fail(errconf);
  413 + param.complete(errconf);
  414 + return false;
  415 + }
  416 + return true;
  417 + },
  418 +
  419 + /**
  420 + * 构造错误数据结构
  421 + * @param {Number} errCode 错误码
  422 + * @param {Number} errMsg 错误描述
  423 + */
  424 + buildErrorConfig(errCode, errMsg) {
  425 + return {
  426 + status: errCode,
  427 + message: errMsg
  428 + };
  429 + },
  430 +
  431 + /**
  432 + *
  433 + * 数据处理函数
  434 + * 根据传入参数不同处理不同数据
  435 + * @param {String} feature 功能名称
  436 + * search 地点搜索
  437 + * suggest关键词提示
  438 + * reverseGeocoder逆地址解析
  439 + * geocoder地址解析
  440 + * getCityList获取城市列表:父集
  441 + * getDistrictByCityId获取区县列表:子集
  442 + * calculateDistance距离计算
  443 + * @param {Object} param 接口参数
  444 + * @param {Object} data 数据
  445 + */
  446 + handleData(param,data,feature){
  447 + if (feature == 'search') {
  448 + var searchResult = data.data;
  449 + var searchSimplify = [];
  450 + for (var i = 0; i < searchResult.length; i++) {
  451 + searchSimplify.push({
  452 + id: searchResult[i].id || null,
  453 + title: searchResult[i].title || null,
  454 + latitude: searchResult[i].location && searchResult[i].location.lat || null,
  455 + longitude: searchResult[i].location && searchResult[i].location.lng || null,
  456 + address: searchResult[i].address || null,
  457 + category: searchResult[i].category || null,
  458 + tel: searchResult[i].tel || null,
  459 + adcode: searchResult[i].ad_info && searchResult[i].ad_info.adcode || null,
  460 + city: searchResult[i].ad_info && searchResult[i].ad_info.city || null,
  461 + district: searchResult[i].ad_info && searchResult[i].ad_info.district || null,
  462 + province: searchResult[i].ad_info && searchResult[i].ad_info.province || null
  463 + })
  464 + }
  465 + param.success(data, {
  466 + searchResult: searchResult,
  467 + searchSimplify: searchSimplify
  468 + })
  469 + } else if (feature == 'suggest') {
  470 + var suggestResult = data.data;
  471 + var suggestSimplify = [];
  472 + for (var i = 0; i < suggestResult.length; i++) {
  473 + suggestSimplify.push({
  474 + adcode: suggestResult[i].adcode || null,
  475 + address: suggestResult[i].address || null,
  476 + category: suggestResult[i].category || null,
  477 + city: suggestResult[i].city || null,
  478 + district: suggestResult[i].district || null,
  479 + id: suggestResult[i].id || null,
  480 + latitude: suggestResult[i].location && suggestResult[i].location.lat || null,
  481 + longitude: suggestResult[i].location && suggestResult[i].location.lng || null,
  482 + province: suggestResult[i].province || null,
  483 + title: suggestResult[i].title || null,
  484 + type: suggestResult[i].type || null
  485 + })
  486 + }
  487 + param.success(data, {
  488 + suggestResult: suggestResult,
  489 + suggestSimplify: suggestSimplify
  490 + })
  491 + } else if (feature == 'reverseGeocoder') {
  492 + var reverseGeocoderResult = data.result;
  493 + var reverseGeocoderSimplify = {
  494 + address: reverseGeocoderResult.address || null,
  495 + latitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lat || null,
  496 + longitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lng || null,
  497 + adcode: reverseGeocoderResult.ad_info && reverseGeocoderResult.ad_info.adcode || null,
  498 + city: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.city || null,
  499 + district: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.district || null,
  500 + nation: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.nation || null,
  501 + province: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.province || null,
  502 + street: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street || null,
  503 + street_number: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street_number || null,
  504 + recommend: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.recommend || null,
  505 + rough: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.rough || null
  506 + };
  507 + if (reverseGeocoderResult.pois) {//判断是否返回周边poi
  508 + var pois = reverseGeocoderResult.pois;
  509 + var poisSimplify = [];
  510 + for (var i = 0;i < pois.length;i++) {
  511 + poisSimplify.push({
  512 + id: pois[i].id || null,
  513 + title: pois[i].title || null,
  514 + latitude: pois[i].location && pois[i].location.lat || null,
  515 + longitude: pois[i].location && pois[i].location.lng || null,
  516 + address: pois[i].address || null,
  517 + category: pois[i].category || null,
  518 + adcode: pois[i].ad_info && pois[i].ad_info.adcode || null,
  519 + city: pois[i].ad_info && pois[i].ad_info.city || null,
  520 + district: pois[i].ad_info && pois[i].ad_info.district || null,
  521 + province: pois[i].ad_info && pois[i].ad_info.province || null
  522 + })
  523 + }
  524 + param.success(data,{
  525 + reverseGeocoderResult: reverseGeocoderResult,
  526 + reverseGeocoderSimplify: reverseGeocoderSimplify,
  527 + pois: pois,
  528 + poisSimplify: poisSimplify
  529 + })
  530 + } else {
  531 + param.success(data, {
  532 + reverseGeocoderResult: reverseGeocoderResult,
  533 + reverseGeocoderSimplify: reverseGeocoderSimplify
  534 + })
  535 + }
  536 + } else if (feature == 'geocoder') {
  537 + var geocoderResult = data.result;
  538 + var geocoderSimplify = {
  539 + title: geocoderResult.title || null,
  540 + latitude: geocoderResult.location && geocoderResult.location.lat || null,
  541 + longitude: geocoderResult.location && geocoderResult.location.lng || null,
  542 + adcode: geocoderResult.ad_info && geocoderResult.ad_info.adcode || null,
  543 + province: geocoderResult.address_components && geocoderResult.address_components.province || null,
  544 + city: geocoderResult.address_components && geocoderResult.address_components.city || null,
  545 + district: geocoderResult.address_components && geocoderResult.address_components.district || null,
  546 + street: geocoderResult.address_components && geocoderResult.address_components.street || null,
  547 + street_number: geocoderResult.address_components && geocoderResult.address_components.street_number || null,
  548 + level: geocoderResult.level || null
  549 + };
  550 + param.success(data,{
  551 + geocoderResult: geocoderResult,
  552 + geocoderSimplify: geocoderSimplify
  553 + });
  554 + } else if (feature == 'getCityList') {
  555 + var provinceResult = data.result[0];
  556 + var cityResult = data.result[1];
  557 + var districtResult = data.result[2];
  558 + param.success(data,{
  559 + provinceResult: provinceResult,
  560 + cityResult: cityResult,
  561 + districtResult: districtResult
  562 + });
  563 + } else if (feature == 'getDistrictByCityId') {
  564 + var districtByCity = data.result[0];
  565 + param.success(data, districtByCity);
  566 + } else if (feature == 'calculateDistance') {
  567 + var calculateDistanceResult = data.result.elements;
  568 + var distance = [];
  569 + for (var i = 0; i < calculateDistanceResult.length; i++){
  570 + distance.push(calculateDistanceResult[i].distance);
  571 + }
  572 + param.success(data, {
  573 + calculateDistanceResult: calculateDistanceResult,
  574 + distance: distance
  575 + });
  576 + } else if (feature == 'direction') {
  577 + var direction = data.result.routes;
  578 + param.success(data,direction);
  579 + } else {
  580 + param.success(data);
  581 + }
  582 + },
  583 +
  584 + /**
  585 + * 构造微信请求参数,公共属性处理
  586 + *
  587 + * @param {Object} param 接口参数
  588 + * @param {Object} param 配置项
  589 + * @param {String} feature 方法名
  590 + */
  591 + buildWxRequestConfig(param, options, feature) {
  592 + var that = this;
  593 + options.header = { "content-type": "application/json" };
  594 + options.method = 'GET';
  595 + options.success = function (res) {
  596 + var data = res.data;
  597 + if (data.status === 0) {
  598 + that.handleData(param, data, feature);
  599 + } else {
  600 + param.fail(data);
  601 + }
  602 + };
  603 + options.fail = function (res) {
  604 + res.statusCode = ERROR_CONF.WX_ERR_CODE;
  605 + param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
  606 + };
  607 + options.complete = function (res) {
  608 + var statusCode = +res.statusCode;
  609 + switch(statusCode) {
  610 + case ERROR_CONF.WX_ERR_CODE: {
  611 + param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
  612 + break;
  613 + }
  614 + case ERROR_CONF.WX_OK_CODE: {
  615 + var data = res.data;
  616 + if (data.status === 0) {
  617 + param.complete(data);
  618 + } else {
  619 + param.complete(that.buildErrorConfig(data.status, data.message));
  620 + }
  621 + break;
  622 + }
  623 + default:{
  624 + param.complete(that.buildErrorConfig(ERROR_CONF.SYSTEM_ERR, ERROR_CONF.SYSTEM_ERR_MSG));
  625 + }
  626 +
  627 + }
  628 + };
  629 + return options;
  630 + },
  631 +
  632 + /**
  633 + * 处理用户参数是否传入坐标进行不同的处理
  634 + */
  635 + locationProcess(param, locationsuccess, locationfail, locationcomplete) {
  636 + var that = this;
  637 + locationfail = locationfail || function (res) {
  638 + res.statusCode = ERROR_CONF.WX_ERR_CODE;
  639 + param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
  640 + };
  641 + locationcomplete = locationcomplete || function (res) {
  642 + if (res.statusCode == ERROR_CONF.WX_ERR_CODE) {
  643 + param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
  644 + }
  645 + };
  646 + if (!param.location) {
  647 + that.getWXLocation(locationsuccess, locationfail, locationcomplete);
  648 + } else if (that.checkLocation(param)) {
  649 + var location = Utils.getLocationParam(param.location);
  650 + locationsuccess(location);
  651 + }
  652 + }
  653 +};
  654 +
  655 +
  656 +class QQMapWX {
  657 +
  658 + /**
  659 + * 构造函数
  660 + *
  661 + * @param {Object} options 接口参数,key 为必选参数
  662 + */
  663 + constructor(options) {
  664 + if (!options.key) {
  665 + throw Error('key值不能为空');
  666 + }
  667 + this.key = options.key;
  668 + };
  669 +
  670 + /**
  671 + * POI周边检索
  672 + *
  673 + * @param {Object} options 接口参数对象
  674 + *
  675 + * 参数对象结构可以参考
  676 + * @see http://lbs.qq.com/webservice_v1/guide-search.html
  677 + */
  678 + search(options) {
  679 + var that = this;
  680 + options = options || {};
  681 +
  682 + Utils.polyfillParam(options);
  683 +
  684 + if (!Utils.checkKeyword(options)) {
  685 + return;
  686 + }
  687 +
  688 + var requestParam = {
  689 + keyword: options.keyword,
  690 + orderby: options.orderby || '_distance',
  691 + page_size: options.page_size || 10,
  692 + page_index: options.page_index || 1,
  693 + output: 'json',
  694 + key: that.key
  695 + };
  696 +
  697 + if (options.address_format) {
  698 + requestParam.address_format = options.address_format;
  699 + }
  700 +
  701 + if (options.filter) {
  702 + requestParam.filter = options.filter;
  703 + }
  704 +
  705 + var distance = options.distance || "1000";
  706 + var auto_extend = options.auto_extend || 1;
  707 + var region = null;
  708 + var rectangle = null;
  709 +
  710 + //判断城市限定参数
  711 + if (options.region) {
  712 + region = options.region;
  713 + }
  714 +
  715 + //矩形限定坐标(暂时只支持字符串格式)
  716 + if (options.rectangle) {
  717 + rectangle = options.rectangle;
  718 + }
  719 +
  720 + var locationsuccess = function (result) {
  721 + if (region && !rectangle) {
  722 + //城市限定参数拼接
  723 + requestParam.boundary = "region(" + region + "," + auto_extend + "," + result.latitude + "," + result.longitude + ")";
  724 + if (options.sig) {
  725 + requestParam.sig = Utils.getSig(requestParam, options.sig, 'search');
  726 + }
  727 + } else if (rectangle && !region) {
  728 + //矩形搜索
  729 + requestParam.boundary = "rectangle(" + rectangle + ")";
  730 + if (options.sig) {
  731 + requestParam.sig = Utils.getSig(requestParam, options.sig, 'search');
  732 + }
  733 + } else {
  734 + requestParam.boundary = "nearby(" + result.latitude + "," + result.longitude + "," + distance + "," + auto_extend + ")";
  735 + if (options.sig) {
  736 + requestParam.sig = Utils.getSig(requestParam, options.sig, 'search');
  737 + }
  738 + }
  739 + wx.request(Utils.buildWxRequestConfig(options, {
  740 + url: URL_SEARCH,
  741 + data: requestParam
  742 + }, 'search'));
  743 + };
  744 + Utils.locationProcess(options, locationsuccess);
  745 + };
  746 +
  747 + /**
  748 + * sug模糊检索
  749 + *
  750 + * @param {Object} options 接口参数对象
  751 + *
  752 + * 参数对象结构可以参考
  753 + * http://lbs.qq.com/webservice_v1/guide-suggestion.html
  754 + */
  755 + getSuggestion(options) {
  756 + var that = this;
  757 + options = options || {};
  758 + Utils.polyfillParam(options);
  759 +
  760 + if (!Utils.checkKeyword(options)) {
  761 + return;
  762 + }
  763 +
  764 + var requestParam = {
  765 + keyword: options.keyword,
  766 + region: options.region || '全国',
  767 + region_fix: options.region_fix || 0,
  768 + policy: options.policy || 0,
  769 + page_size: options.page_size || 10,//控制显示条数
  770 + page_index: options.page_index || 1,//控制页数
  771 + get_subpois : options.get_subpois || 0,//返回子地点
  772 + output: 'json',
  773 + key: that.key
  774 + };
  775 + //长地址
  776 + if (options.address_format) {
  777 + requestParam.address_format = options.address_format;
  778 + }
  779 + //过滤
  780 + if (options.filter) {
  781 + requestParam.filter = options.filter;
  782 + }
  783 + //排序
  784 + if (options.location) {
  785 + var locationsuccess = function (result) {
  786 + requestParam.location = result.latitude + ',' + result.longitude;
  787 + if (options.sig) {
  788 + requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest');
  789 + }
  790 + wx.request(Utils.buildWxRequestConfig(options, {
  791 + url: URL_SUGGESTION,
  792 + data: requestParam
  793 + }, "suggest"));
  794 + };
  795 + Utils.locationProcess(options, locationsuccess);
  796 + } else {
  797 + if (options.sig) {
  798 + requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest');
  799 + }
  800 + wx.request(Utils.buildWxRequestConfig(options, {
  801 + url: URL_SUGGESTION,
  802 + data: requestParam
  803 + }, "suggest"));
  804 + }
  805 + };
  806 +
  807 + /**
  808 + * 逆地址解析
  809 + *
  810 + * @param {Object} options 接口参数对象
  811 + *
  812 + * 请求参数结构可以参考
  813 + * http://lbs.qq.com/webservice_v1/guide-gcoder.html
  814 + */
  815 + reverseGeocoder(options) {
  816 + var that = this;
  817 + options = options || {};
  818 + Utils.polyfillParam(options);
  819 + var requestParam = {
  820 + coord_type: options.coord_type || 5,
  821 + get_poi: options.get_poi || 0,
  822 + output: 'json',
  823 + key: that.key
  824 + };
  825 + if (options.poi_options) {
  826 + requestParam.poi_options = options.poi_options
  827 + }
  828 +
  829 + var locationsuccess = function (result) {
  830 + requestParam.location = result.latitude + ',' + result.longitude;
  831 + if (options.sig) {
  832 + requestParam.sig = Utils.getSig(requestParam, options.sig, 'reverseGeocoder');
  833 + }
  834 + wx.request(Utils.buildWxRequestConfig(options, {
  835 + url: URL_GET_GEOCODER,
  836 + data: requestParam
  837 + }, 'reverseGeocoder'));
  838 + };
  839 + Utils.locationProcess(options, locationsuccess);
  840 + };
  841 +
  842 + /**
  843 + * 地址解析
  844 + *
  845 + * @param {Object} options 接口参数对象
  846 + *
  847 + * 请求参数结构可以参考
  848 + * http://lbs.qq.com/webservice_v1/guide-geocoder.html
  849 + */
  850 + geocoder(options) {
  851 + var that = this;
  852 + options = options || {};
  853 + Utils.polyfillParam(options);
  854 +
  855 + if (Utils.checkParamKeyEmpty(options, 'address')) {
  856 + return;
  857 + }
  858 +
  859 + var requestParam = {
  860 + address: options.address,
  861 + output: 'json',
  862 + key: that.key
  863 + };
  864 +
  865 + //城市限定
  866 + if (options.region) {
  867 + requestParam.region = options.region;
  868 + }
  869 +
  870 + if (options.sig) {
  871 + requestParam.sig = Utils.getSig(requestParam, options.sig, 'geocoder');
  872 + }
  873 +
  874 + wx.request(Utils.buildWxRequestConfig(options, {
  875 + url: URL_GET_GEOCODER,
  876 + data: requestParam
  877 + },'geocoder'));
  878 + };
  879 +
  880 +
  881 + /**
  882 + * 获取城市列表
  883 + *
  884 + * @param {Object} options 接口参数对象
  885 + *
  886 + * 请求参数结构可以参考
  887 + * http://lbs.qq.com/webservice_v1/guide-region.html
  888 + */
  889 + getCityList(options) {
  890 + var that = this;
  891 + options = options || {};
  892 + Utils.polyfillParam(options);
  893 + var requestParam = {
  894 + output: 'json',
  895 + key: that.key
  896 + };
  897 +
  898 + if (options.sig) {
  899 + requestParam.sig = Utils.getSig(requestParam, options.sig, 'getCityList');
  900 + }
  901 +
  902 + wx.request(Utils.buildWxRequestConfig(options, {
  903 + url: URL_CITY_LIST,
  904 + data: requestParam
  905 + },'getCityList'));
  906 + };
  907 +
  908 + /**
  909 + * 获取对应城市ID的区县列表
  910 + *
  911 + * @param {Object} options 接口参数对象
  912 + *
  913 + * 请求参数结构可以参考
  914 + * http://lbs.qq.com/webservice_v1/guide-region.html
  915 + */
  916 + getDistrictByCityId(options) {
  917 + var that = this;
  918 + options = options || {};
  919 + Utils.polyfillParam(options);
  920 +
  921 + if (Utils.checkParamKeyEmpty(options, 'id')) {
  922 + return;
  923 + }
  924 +
  925 + var requestParam = {
  926 + id: options.id || '',
  927 + output: 'json',
  928 + key: that.key
  929 + };
  930 +
  931 + if (options.sig) {
  932 + requestParam.sig = Utils.getSig(requestParam, options.sig, 'getDistrictByCityId');
  933 + }
  934 +
  935 + wx.request(Utils.buildWxRequestConfig(options, {
  936 + url: URL_AREA_LIST,
  937 + data: requestParam
  938 + },'getDistrictByCityId'));
  939 + };
  940 +
  941 + /**
  942 + * 用于单起点到多终点的路线距离(非直线距离)计算:
  943 + * 支持两种距离计算方式:步行和驾车。
  944 + * 起点到终点最大限制直线距离10公里。
  945 + *
  946 + * 新增直线距离计算。
  947 + *
  948 + * @param {Object} options 接口参数对象
  949 + *
  950 + * 请求参数结构可以参考
  951 + * http://lbs.qq.com/webservice_v1/guide-distance.html
  952 + */
  953 + calculateDistance(options) {
  954 + var that = this;
  955 + options = options || {};
  956 + Utils.polyfillParam(options);
  957 +
  958 + if (Utils.checkParamKeyEmpty(options, 'to')) {
  959 + return;
  960 + }
  961 +
  962 + var requestParam = {
  963 + mode: options.mode || 'walking',
  964 + to: Utils.location2query(options.to),
  965 + output: 'json',
  966 + key: that.key
  967 + };
  968 +
  969 + if (options.from) {
  970 + options.location = options.from;
  971 + }
  972 +
  973 + //计算直线距离
  974 + if(requestParam.mode == 'straight'){
  975 + var locationsuccess = function (result) {
  976 + var locationTo = Utils.getEndLocation(requestParam.to);//处理终点坐标
  977 + var data = {
  978 + message:"query ok",
  979 + result:{
  980 + elements:[]
  981 + },
  982 + status:0
  983 + };
  984 + for (var i = 0; i < locationTo.length; i++) {
  985 + data.result.elements.push({//将坐标存入
  986 + distance: Utils.getDistance(result.latitude, result.longitude, locationTo[i].lat, locationTo[i].lng),
  987 + duration:0,
  988 + from:{
  989 + lat: result.latitude,
  990 + lng:result.longitude
  991 + },
  992 + to:{
  993 + lat: locationTo[i].lat,
  994 + lng: locationTo[i].lng
  995 + }
  996 + });
  997 + }
  998 + var calculateResult = data.result.elements;
  999 + var distanceResult = [];
  1000 + for (var i = 0; i < calculateResult.length; i++) {
  1001 + distanceResult.push(calculateResult[i].distance);
  1002 + }
  1003 + return options.success(data,{
  1004 + calculateResult: calculateResult,
  1005 + distanceResult: distanceResult
  1006 + });
  1007 + };
  1008 +
  1009 + Utils.locationProcess(options, locationsuccess);
  1010 + } else {
  1011 + var locationsuccess = function (result) {
  1012 + requestParam.from = result.latitude + ',' + result.longitude;
  1013 + if (options.sig) {
  1014 + requestParam.sig = Utils.getSig(requestParam, options.sig, 'calculateDistance');
  1015 + }
  1016 + wx.request(Utils.buildWxRequestConfig(options, {
  1017 + url: URL_DISTANCE,
  1018 + data: requestParam
  1019 + },'calculateDistance'));
  1020 + };
  1021 +
  1022 + Utils.locationProcess(options, locationsuccess);
  1023 + }
  1024 + };
  1025 +
  1026 + /**
  1027 + * 路线规划:
  1028 + *
  1029 + * @param {Object} options 接口参数对象
  1030 + *
  1031 + * 请求参数结构可以参考
  1032 + * https://lbs.qq.com/webservice_v1/guide-road.html
  1033 + */
  1034 + direction(options) {
  1035 + var that = this;
  1036 + options = options || {};
  1037 + Utils.polyfillParam(options);
  1038 +
  1039 + if (Utils.checkParamKeyEmpty(options, 'to')) {
  1040 + return;
  1041 + }
  1042 +
  1043 + var requestParam = {
  1044 + output: 'json',
  1045 + key: that.key
  1046 + };
  1047 +
  1048 + //to格式处理
  1049 + if (typeof options.to == 'string') {
  1050 + requestParam.to = options.to;
  1051 + } else {
  1052 + requestParam.to = options.to.latitude + ',' + options.to.longitude;
  1053 + }
  1054 + //初始化局部请求域名
  1055 + var SET_URL_DIRECTION = null;
  1056 + //设置默认mode属性
  1057 + options.mode = options.mode || MODE.driving;
  1058 +
  1059 + //设置请求域名
  1060 + SET_URL_DIRECTION = URL_DIRECTION + options.mode;
  1061 +
  1062 + if (options.from) {
  1063 + options.location = options.from;
  1064 + }
  1065 +
  1066 + if (options.mode == MODE.driving) {
  1067 + if (options.from_poi) {
  1068 + requestParam.from_poi = options.from_poi;
  1069 + }
  1070 + if (options.heading) {
  1071 + requestParam.heading = options.heading;
  1072 + }
  1073 + if (options.speed) {
  1074 + requestParam.speed = options.speed;
  1075 + }
  1076 + if (options.accuracy) {
  1077 + requestParam.accuracy = options.accuracy;
  1078 + }
  1079 + if (options.road_type) {
  1080 + requestParam.road_type = options.road_type;
  1081 + }
  1082 + if (options.to_poi) {
  1083 + requestParam.to_poi = options.to_poi;
  1084 + }
  1085 + if (options.from_track) {
  1086 + requestParam.from_track = options.from_track;
  1087 + }
  1088 + if (options.waypoints) {
  1089 + requestParam.waypoints = options.waypoints;
  1090 + }
  1091 + if (options.policy) {
  1092 + requestParam.policy = options.policy;
  1093 + }
  1094 + if (options.plate_number) {
  1095 + requestParam.plate_number = options.plate_number;
  1096 + }
  1097 + }
  1098 +
  1099 + if (options.mode == MODE.transit) {
  1100 + if (options.departure_time) {
  1101 + requestParam.departure_time = options.departure_time;
  1102 + }
  1103 + if (options.policy) {
  1104 + requestParam.policy = options.policy;
  1105 + }
  1106 + }
  1107 +
  1108 + var locationsuccess = function (result) {
  1109 + requestParam.from = result.latitude + ',' + result.longitude;
  1110 + if (options.sig) {
  1111 + requestParam.sig = Utils.getSig(requestParam, options.sig, 'direction',options.mode);
  1112 + }
  1113 + wx.request(Utils.buildWxRequestConfig(options, {
  1114 + url: SET_URL_DIRECTION,
  1115 + data: requestParam
  1116 + }, 'direction'));
  1117 + };
  1118 +
  1119 + Utils.locationProcess(options, locationsuccess);
  1120 + }
  1121 +};
  1122 +
  1123 +module.exports = QQMapWX;