├── .DS_Store ├── README.md ├── app.js ├── app.json ├── app.wxss ├── images ├── .DS_Store ├── campus_location.png ├── home.png ├── home_selected.png ├── joke.png ├── joke_selected.png ├── loadFail.png ├── mine.png ├── mine_selected.png ├── music.png ├── music_selected.png ├── pause.png └── play.png ├── pages ├── .DS_Store ├── index │ ├── index.js │ ├── index.json │ ├── index.wxml │ └── index.wxss ├── joke │ ├── joke.js │ ├── joke.json │ ├── joke.wxml │ └── joke.wxss ├── mine │ ├── .DS_Store │ ├── mine.js │ ├── mine.json │ ├── mine.wxml │ ├── mine.wxss │ ├── qqmap-wx-jssdk.js │ └── qqmap-wx-jssdk.min.js ├── music │ ├── .DS_Store │ ├── music.js │ ├── music.json │ ├── music.wxml │ └── music.wxss └── videoDetail │ ├── videoDetail.js │ ├── videoDetail.json │ ├── videoDetail.wxml │ └── videoDetail.wxss ├── pics ├── .DS_Store ├── 1.png ├── 2.png ├── 3.png ├── 4.png └── 5.png ├── project.config.json └── sitemap.json /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/.DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 基于bilibili清华大学微信小程序开发教程编写的 微信小程序 2 | 3 | #### App RN版本: 4 | #### b站清华大学小程序视频地址: 5 | 6 | #### 内容涉及: 7 | 1.基础界面的搭建; 8 | 2.网络请求、JSON Parse与数据渲染; 9 | 3.音视频播放; 10 | 4.地图:获取位置坐标、反地址解析、添加Markers; 11 | 5.下拉刷新、上拉加载; 12 | 6.其他; 13 | 14 | #### 效果图: 15 |

16 | 17 | 18 | 19 | 20 | 21 |

22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | //app.js 2 | App({ 3 | 4 | onLaunch: function () { 5 | wx.setTabBarBadge({ 6 | index: 3, 7 | text: '10' 8 | }); 9 | wx.showTabBarRedDot({ 10 | index: 0, 11 | }) 12 | }, 13 | globalData: { 14 | userInfo: null 15 | }, 16 | 17 | }) -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages": [ 3 | "pages/index/index", 4 | "pages/music/music", 5 | "pages/videoDetail/videoDetail", 6 | "pages/joke/joke", 7 | "pages/mine/mine" 8 | ], 9 | "window": { 10 | "backgroundTextStyle": "light", 11 | "navigationBarBackgroundColor": "#333333", 12 | "navigationBarTitleText": "看视频", 13 | "navigationBarTextStyle": "white" 14 | }, 15 | "tabBar": { 16 | "selectedColor": "#333333", 17 | "color": "#bfbfbf", 18 | "list": [ 19 | { 20 | "pagePath": "pages/index/index", 21 | "text": "视频", 22 | "iconPath": "images/home.png", 23 | "selectedIconPath": "images/home_selected.png" 24 | }, 25 | { 26 | "pagePath": "pages/joke/joke", 27 | "text": "段子", 28 | "iconPath": "images/joke.png", 29 | "selectedIconPath": "images/joke_selected.png" 30 | }, 31 | { 32 | "pagePath": "pages/music/music", 33 | "text": "听歌", 34 | "iconPath": "images/music.png", 35 | "selectedIconPath": "images/music_selected.png" 36 | }, 37 | { 38 | "pagePath": "pages/mine/mine", 39 | "text": "我的", 40 | "iconPath": "images/mine.png", 41 | "selectedIconPath": "images/mine_selected.png" 42 | } 43 | ] 44 | }, 45 | "sitemapLocation": "sitemap.json", 46 | "permission": { 47 | "scope.userLocation": { 48 | "desc": "你的位置信息将用于小程序位置接口的效果展示" 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /app.wxss: -------------------------------------------------------------------------------- 1 | /**app.wxss**/ 2 | .container { 3 | height: 100%; 4 | display: flex; 5 | flex-direction: column; 6 | align-items: center; 7 | justify-content: space-between; 8 | /* padding: 200rpx 0; */ 9 | box-sizing: border-box; 10 | } 11 | 12 | /**index.wxss**/ 13 | 14 | .container { 15 | padding: 5px; 16 | flex-direction:column; 17 | display: inline-block; 18 | 19 | } 20 | 21 | .headerContainer{ 22 | /* background-color: red; */ 23 | margin: 0; 24 | width: 730rpx; 25 | font-size: 14.0px; 26 | flex-direction:row; 27 | display: inline-flex 28 | } 29 | 30 | .headerSubContainer{ 31 | color: rebeccapurple; 32 | width: 460rpx; 33 | padding-left: 5px; 34 | margin: 0px; 35 | display: inline-flex; 36 | font-size: 14px; 37 | flex-direction:column; 38 | justify-content: center 39 | } 40 | 41 | .headerImage{ 42 | width: 50px; 43 | height: 50px; 44 | margin: 0px; 45 | border-radius: 25px; 46 | box-shadow: 1px 1px 2px gray; 47 | } 48 | 49 | .contentText{ 50 | color: #222333; 51 | width:730rpx; 52 | font-size: 16px; 53 | 54 | } 55 | 56 | .subText{ 57 | overflow: hidden; 58 | white-space: nowrap; 59 | text-overflow:ellipsis; 60 | font-size: 12px; 61 | color: grey; 62 | } 63 | 64 | .bgImage{ 65 | width:730rpx; 66 | border-radius: 2px; 67 | } 68 | 69 | .seperateLine{ 70 | margin-top: 10px; 71 | width: 100%; 72 | height: 1px; 73 | background-color: #F2F2F2 74 | } 75 | 76 | .shareImg{ 77 | width: 60px; 78 | height: 30px; 79 | } 80 | 81 | .btn{ 82 | border: 1px solid pink; 83 | border-radius: 5px; 84 | height: 30px; 85 | /* left: 15px; */ 86 | 87 | width: 50px; 88 | top: 10px; 89 | padding: 0px; 90 | margin-right: 0px; 91 | font-size: 12px; 92 | justify-content: center; 93 | color: pink; 94 | background-color: white; 95 | } 96 | 97 | .btn::after{ 98 | border: none; 99 | } 100 | 101 | .infoBtn{ 102 | border: 1px solid pink; 103 | border-radius: 5px; 104 | height: 30px; 105 | width: 50px; 106 | margin-right: 0px; 107 | padding: 0px; 108 | top: 10px; 109 | font-size: 12px; 110 | justify-content: center; 111 | color: pink; 112 | background-color: white; 113 | } 114 | 115 | .infoBtn::after{ 116 | border: none; 117 | } 118 | 119 | .jokeText{ 120 | display: inline-block; 121 | font-size: 16px; 122 | color: #333333; 123 | margin: 0px; 124 | padding: 0px; 125 | 126 | } 127 | 128 | .headerContentText{ 129 | font-size: 12px; 130 | color:grey; 131 | overflow: hidden; 132 | white-space: nowrap; 133 | text-overflow:ellipsis; 134 | 135 | } 136 | 137 | .line{ 138 | width: 730rpx; 139 | margin-top: 5px; 140 | height: 1px; 141 | background-color:#F2F2F2; 142 | 143 | } 144 | 145 | .mapView{ 146 | display: inline-block; 147 | flex-direction: column; 148 | align-items: center; 149 | justify-content: space-between; 150 | margin: 5px; 151 | 152 | } 153 | 154 | map{ 155 | width: 730rpx; 156 | height: 160px; 157 | border-radius: 5px; 158 | } 159 | .mapSb{ 160 | height: 10px; 161 | } 162 | 163 | .mapText{ 164 | display: inline-block; 165 | width: 750rpx; 166 | color:#333333; 167 | font-size: 14px; 168 | font-weight: bold; 169 | text-align: center; 170 | } -------------------------------------------------------------------------------- /images/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/images/.DS_Store -------------------------------------------------------------------------------- /images/campus_location.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/images/campus_location.png -------------------------------------------------------------------------------- /images/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/images/home.png -------------------------------------------------------------------------------- /images/home_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/images/home_selected.png -------------------------------------------------------------------------------- /images/joke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/images/joke.png -------------------------------------------------------------------------------- /images/joke_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/images/joke_selected.png -------------------------------------------------------------------------------- /images/loadFail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/images/loadFail.png -------------------------------------------------------------------------------- /images/mine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/images/mine.png -------------------------------------------------------------------------------- /images/mine_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/images/mine_selected.png -------------------------------------------------------------------------------- /images/music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/images/music.png -------------------------------------------------------------------------------- /images/music_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/images/music_selected.png -------------------------------------------------------------------------------- /images/pause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/images/pause.png -------------------------------------------------------------------------------- /images/play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/images/play.png -------------------------------------------------------------------------------- /pages/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/pages/.DS_Store -------------------------------------------------------------------------------- /pages/index/index.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | Page({ 4 | data: { 5 | currentIndex:0, 6 | videoList:[], 7 | }, 8 | 9 | onPullDownRefresh: function () { 10 | console.log('下拉加载更多'); 11 | wx.showNavigationBarLoading() //在标题栏中显示加载 12 | this.requestMsgs(false); 13 | }, 14 | onReachBottom:function(){ 15 | console.log('上拉刷新'); 16 | wx.showNavigationBarLoading(); 17 | this.requestMsgs(true); 18 | }, 19 | onShareAppMessage: function (msg) { 20 | console.log(msg); 21 | }, 22 | 23 | shareMsg: function (msg) { 24 | console.log(msg); 25 | this.onShareAppMessage(msg); 26 | }, 27 | 28 | f1: function (itemMsg) { 29 | console.log(itemMsg); 30 | var index = itemMsg.currentTarget.dataset.index; 31 | var item = itemMsg.currentTarget.dataset.videoMsgs; 32 | var img = 'videoList[' + index + '].thumbnail' 33 | this.setData({ 34 | [img]: '../../images/loadFail.png' 35 | }); 36 | }, 37 | f0:function(event){ 38 | 39 | var video = event.currentTarget.dataset.videoMsgs.video; 40 | var headerName = event.currentTarget.dataset.videoMsgs.top_comments_name; 41 | var headerImage = event.currentTarget.dataset.videoMsgs.header; 42 | var headerContent = event.currentTarget.dataset.videoMsgs.top_comments_content; 43 | wx.navigateTo({ 44 | url: '../videoDetail/videoDetail?' + 'video=' + video + '&headerName=' + headerName + '&headerImage=' + headerImage +'&headerContent='+headerContent, 45 | }) 46 | 47 | }, 48 | 49 | requestMsgs:function(isBottom){ 50 | var that = this; 51 | wx.request({ 52 | url: 'https://api.apiopen.top/getJoke', 53 | data: { 54 | "page": 0, 55 | "count": "20", 56 | "type": "video" 57 | }, 58 | success: function (res) { 59 | if(res.data.code==200){ 60 | var data = res.data.result; 61 | if(isBottom){ 62 | data = that.data.videoList.concat(data); 63 | }else{ 64 | data = data.concat(that.data.videoList); 65 | } 66 | that.setData({ 67 | videoList: data 68 | }); 69 | wx.hideNavigationBarLoading(); 70 | if(isBottom==false){ 71 | wx.stopPullDownRefresh(); 72 | } 73 | } 74 | }, 75 | fail: function (err) { 76 | }, 77 | complete: function (res) { 78 | }, 79 | 80 | }); 81 | }, 82 | 83 | onLoad: function () { 84 | this.requestMsgs(false); 85 | }, 86 | 87 | }) 88 | -------------------------------------------------------------------------------- /pages/index/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": {}, 3 | "enablePullDownRefresh":true, 4 | "backgroundTextStyle":"dark" 5 | 6 | } -------------------------------------------------------------------------------- /pages/index/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{item.name}} 8 | {{item.top_comments_content}} 9 | 10 | 11 | 12 | 13 | {{item.text}} 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /pages/index/index.wxss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/pages/index/index.wxss -------------------------------------------------------------------------------- /pages/joke/joke.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | Page({ 4 | data: { 5 | currentIndex: 0, 6 | jokeList: [], 7 | }, 8 | 9 | onPullDownRefresh: function () { 10 | console.log('下拉加载更多'); 11 | wx.showNavigationBarLoading() //在标题栏中显示加载 12 | this.requestMsgs(false); 13 | }, 14 | onReachBottom: function () { 15 | console.log('上拉刷新'); 16 | wx.showNavigationBarLoading(); 17 | this.requestMsgs(true); 18 | }, 19 | onShareAppMessage: function (msg) { 20 | console.log(msg); 21 | }, 22 | 23 | f0:function(itemMsg){ 24 | console.log(itemMsg); 25 | var index = itemMsg.currentTarget.dataset.index; 26 | var item = itemMsg.currentTarget.dataset.item; 27 | if(item.type=='video'){ 28 | var img = 'jokeList[' + index + '].thumbnail' 29 | this.setData({ 30 | [img] : '../../images/loadFail.png' 31 | }); 32 | } else if (item.type == 'gif') { 33 | var img = 'jokeList[' + index + '].gif' 34 | this.setData({ 35 | [img]: '../../images/loadFail.png' 36 | }); 37 | 38 | } else if (item.type == 'image') { 39 | var img = 'jokeList[' + index + '].image' 40 | this.setData({ 41 | [img]: '../../images/loadFail.png' 42 | }); 43 | } 44 | }, 45 | // https://api.apiopen.top/getJoke?page=1&count=2&type=text 46 | 47 | requestMsgs: function (isBottom) { 48 | var that = this; 49 | wx.request({ 50 | url: 'https://api.apiopen.top/getJoke', 51 | data: { 52 | "type":"text", 53 | "page": 0, 54 | "count":20, 55 | }, 56 | success: function (res) { 57 | console.log(res); 58 | if (res.data.code == 200) { 59 | var data = res.data.result; 60 | if (isBottom) { 61 | data = that.data.jokeList.concat(data); 62 | } else { 63 | data = data.concat(that.data.jokeList); 64 | } 65 | that.setData({ 66 | jokeList: data 67 | }); 68 | wx.hideNavigationBarLoading(); 69 | if (isBottom == false) { 70 | wx.stopPullDownRefresh(); 71 | } 72 | } 73 | }, 74 | fail: function (err) { 75 | }, 76 | complete: function (res) { 77 | }, 78 | 79 | }); 80 | }, 81 | 82 | onLoad: function () { 83 | this.requestMsgs(false); 84 | }, 85 | 86 | }) 87 | -------------------------------------------------------------------------------- /pages/joke/joke.json: -------------------------------------------------------------------------------- 1 | { 2 | "enablePullDownRefresh": true, 3 | "backgroundTextStyle": "dark", 4 | "navigationBarTitleText": "刷段子" 5 | } 6 | -------------------------------------------------------------------------------- /pages/joke/joke.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{item.top_comments_name}} 7 | {{item.top_comments_content}} 8 | 9 | 10 | 11 | {{item.text}} 12 | 13 | 14 | -------------------------------------------------------------------------------- /pages/joke/joke.wxss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/pages/joke/joke.wxss -------------------------------------------------------------------------------- /pages/mine/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/pages/mine/.DS_Store -------------------------------------------------------------------------------- /pages/mine/mine.js: -------------------------------------------------------------------------------- 1 | 2 | // 引入SDK核心类 3 | var QQMapWX = require('./qqmap-wx-jssdk.js'); 4 | var qqmapsdk = new QQMapWX({ 5 | key: 'LTWBZ-5I23Q-6IW5M-GDLZ2-DVMGJ-FYBSS' 6 | }); 7 | 8 | Page({ 9 | data: { 10 | longitude: 0, 11 | latitude: 0, 12 | address:'', 13 | markers:[], 14 | nickName:'', 15 | avatarUrl:'', 16 | }, 17 | geoAddress(lati, long) { 18 | var that = this; 19 | qqmapsdk.reverseGeocoder({ 20 | location: { 21 | latitude: lati, 22 | longitude: long 23 | }, 24 | success: function (addressRes) { 25 | console.log(addressRes); 26 | var address = addressRes.result.formatted_addresses.recommend; 27 | console.log(address); 28 | that.setData({ 29 | address: address, 30 | }) 31 | }, 32 | fail: function (res) { 33 | console.log(res); 34 | wx.showToast({ 35 | title: '解析地址错误', 36 | icon: 'loading', 37 | duration: 1000 38 | }); 39 | 40 | }, 41 | 42 | }) 43 | }, 44 | 45 | getUserMsg:function(){ 46 | var _this = this; 47 | wx.getUserInfo({ 48 | success(res) { 49 | const userInfo = res.userInfo 50 | const nickName = userInfo.nickName 51 | const avatarUrl = userInfo.avatarUrl 52 | const gender = userInfo.gender // 性别 0:未知、1:男、2:女 53 | const province = userInfo.province 54 | const city = userInfo.city 55 | const country = userInfo.country 56 | _this.setData({ 57 | nickName: nickName, 58 | avatarUrl: avatarUrl 59 | }); 60 | }, 61 | fail(error){ 62 | console.log(error); 63 | } 64 | }); 65 | }, 66 | choose:function(){ 67 | wx.chooseLocation({ 68 | //位置选择成功的回调: 69 | success: function(res) { 70 | console.log('你妹啊'); 71 | console.log(res); 72 | console.log('你妹啊'); 73 | }, 74 | }) 75 | }, 76 | requestLocation:function(){ 77 | var that = this; 78 | wx.getLocation({ 79 | type: 'gcj02', 80 | success: function (res) { 81 | console.log(res); 82 | const latitude = res.latitude 83 | const longitude = res.longitude 84 | console.log(longitude); 85 | that.geoAddress(latitude, longitude); 86 | that.setData({ 87 | longitude: longitude, 88 | latitude: latitude, 89 | markers: [{ 90 | iconPath: '../../images/campus_location.png', 91 | id: 0, 92 | width: 32, 93 | height: 32, 94 | latitude: latitude, 95 | longitude: longitude, 96 | title: '我的位置', 97 | }] 98 | }); 99 | }, 100 | }) 101 | }, 102 | onGotUserInfo(e) { 103 | this.getUserMsg(); 104 | }, 105 | onLoad: function () { 106 | // 实例化API核心类 107 | this.getUserMsg(); 108 | }, 109 | 110 | onShow:function(){ 111 | this.requestLocation(); 112 | wx.removeTabBarBadge({ 113 | index: 3, 114 | }) 115 | } 116 | 117 | }) 118 | 119 | -------------------------------------------------------------------------------- /pages/mine/mine.json: -------------------------------------------------------------------------------- 1 | { 2 | "navigationBarTitleText": "个人中心" 3 | } -------------------------------------------------------------------------------- /pages/mine/mine.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {{nickName}} 9 | {{address}} 10 | 11 | 12 | 13 | 14 | 选择位置 15 | 16 | -------------------------------------------------------------------------------- /pages/mine/mine.wxss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/pages/mine/mine.wxss -------------------------------------------------------------------------------- /pages/mine/qqmap-wx-jssdk.js: -------------------------------------------------------------------------------- 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; -------------------------------------------------------------------------------- /pages/mine/qqmap-wx-jssdk.min.js: -------------------------------------------------------------------------------- 1 | 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 = { 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) { 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) }, 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 }, 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 }, 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 }, 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 }) }, 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 () { } }, 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 }, checkKeyword(param) { return !this.checkParamKeyEmpty(param, 'keyword') }, 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 }, buildErrorConfig(errCode, errMsg) { return { status: errCode, message: errMsg } }, 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) { 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) } }, 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 { constructor(options) { if (!options.key) { throw Error('key值不能为空') } this.key = options.key }; 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) }; 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")) } }; 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) }; 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')) }; 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')) }; 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')) }; 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) } }; direction(options) { var that = this; options = options || {}; Utils.polyfillParam(options); if (Utils.checkParamKeyEmpty(options, 'to')) { return } var requestParam = { output: 'json', key: that.key }; if (typeof options.to == 'string') { requestParam.to = options.to } else { requestParam.to = options.to.latitude + ',' + options.to.longitude } var SET_URL_DIRECTION = null; 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; -------------------------------------------------------------------------------- /pages/music/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/pages/music/.DS_Store -------------------------------------------------------------------------------- /pages/music/music.js: -------------------------------------------------------------------------------- 1 | 2 | const innerAudioContext = wx.createInnerAudioContext(); 3 | Page({ 4 | data: { 5 | musics: [], 6 | playIndex:0, 7 | isPlaying:false, 8 | }, 9 | 10 | reuqestMusic:function(key){ 11 | if(key.length==0){ 12 | return; 13 | } 14 | wx.showNavigationBarLoading(); 15 | var that = this; 16 | wx.request({ 17 | url: 'https://api.apiopen.top/searchMusic?name='+key, 18 | success: function (res) { 19 | console.log(res); 20 | if(res.data.code==200){ 21 | that.setData({ 22 | musics: res.data.result 23 | }); 24 | }else{ 25 | wx.showToast({ 26 | title: '未找到对应歌曲', 27 | }); 28 | } 29 | wx.hideNavigationBarLoading(); 30 | }, 31 | fail: function (error) { 32 | }, 33 | complete: function () { 34 | wx.hideNavigationBarLoading(); 35 | }, 36 | }) 37 | }, 38 | 39 | onLoad: function () { 40 | this.reuqestMusic('权利的游戏'); 41 | innerAudioContext.onStop((res) => { 42 | console.log('播放结束'+res); 43 | this.setData({ 44 | isPlaying:false, 45 | }); 46 | }); 47 | }, 48 | 49 | onHide() { 50 | 51 | // innerAudioContext.pause(); 52 | // this.setData({ 53 | // isPlaying: false, 54 | // }); 55 | }, 56 | onUnload() { 57 | // innerAudioContext.pause(); 58 | // this.setData({ 59 | // isPlaying: false, 60 | // }); 61 | }, 62 | onShow(){ 63 | wx.hideNavigationBarLoading(); 64 | if (innerAudioContext){ 65 | innerAudioContext.play(); 66 | } 67 | 68 | // this.setData({ 69 | // isPlaying: isPlaying, 70 | // }); 71 | }, 72 | 73 | //播放音乐 74 | f0:function(event){ 75 | 76 | wx.showNavigationBarLoading(); 77 | console.log(event); 78 | var url = event.currentTarget.dataset.url; 79 | var index = event.currentTarget.dataset.index; 80 | this.setData({ 81 | playIndex:index, 82 | isPlaying:true, 83 | }); 84 | innerAudioContext.src = url; 85 | innerAudioContext.play(); 86 | //开始正常播放音频文件: 87 | innerAudioContext.onPlay(()=>{ 88 | wx.hideNavigationBarLoading(); 89 | }); 90 | innerAudioContext.onError((error)=>{ 91 | this.setData({ 92 | isPlaying: false, 93 | }); 94 | var errCode = error.errorCode; 95 | var errorMsg = ''; 96 | if (errCode == 10001){ 97 | errorMsg = '系统错误'; 98 | } else if (errCode == 10002){ 99 | errorMsg = '网络错误'; 100 | } 101 | else if (errCode == 10003){ 102 | errorMsg = '文件错误'; 103 | } else if (errCode == 10004){ 104 | errorMsg = '格式错误'; 105 | }else{ 106 | errorMsg = '未知错误'; 107 | } 108 | wx.showToast({ 109 | title: errorMsg, 110 | }) 111 | }); 112 | 113 | }, 114 | 115 | f1:function(key){ 116 | console.log(key.detail.value); 117 | this.reuqestMusic(key.detail.value); 118 | } 119 | 120 | 121 | 122 | }) 123 | -------------------------------------------------------------------------------- /pages/music/music.json: -------------------------------------------------------------------------------- 1 | { 2 | "navigationBarTitleText": "听音乐", 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /pages/music/music.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {{item.title}} 9 | {{item.author}} 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /pages/music/music.wxss: -------------------------------------------------------------------------------- 1 | 2 | 3 | .container { 4 | padding: 5px; 5 | flex-direction:column; 6 | display: inline-block; 7 | 8 | } 9 | 10 | input{ 11 | height: 70rpx; 12 | width: 710rpx; 13 | border-radius: 15px; 14 | background-color:#F2F2F2; 15 | font-size: 14px; 16 | border:1px black; 17 | color:#6a6f77; 18 | padding-left: 10px; 19 | } 20 | 21 | .headerContainer{ 22 | height: 60px; 23 | padding: 0; 24 | font-size: 14.0px; 25 | flex-direction:row; 26 | display: inline-flex; 27 | justify-items: center; 28 | width: 730rpx; 29 | 30 | } 31 | .musicSubContainer{ 32 | color: rebeccapurple; 33 | width: 570rpx; 34 | padding: 0px; 35 | margin: 0px; 36 | padding-left: 5px; 37 | display: inline-flex; 38 | font-size: 14px; 39 | flex-direction:column; 40 | justify-content: center 41 | } 42 | 43 | .headerImage{ 44 | width: 50px; 45 | height: 50px; 46 | border-radius: 25px; 47 | margin: 5px; 48 | } 49 | 50 | .contentText{ 51 | color: '#222333'; 52 | width:730rpx 53 | } 54 | 55 | .subText{ 56 | color: 'red' 57 | } 58 | 59 | .separte{ 60 | 61 | background-color:#F2F2F2; 62 | height: 1px; 63 | width: 730rpx; 64 | } 65 | 66 | .statusImage{ 67 | 68 | display: inline-block; 69 | width: 15px; 70 | height: 15px; 71 | padding: 0px; 72 | margin-top:20px; 73 | margin-right: 5px; 74 | 75 | } -------------------------------------------------------------------------------- /pages/videoDetail/videoDetail.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | Page({ 4 | data: { 5 | video:'', 6 | headerName:'', 7 | headerImage:'', 8 | headerContent:'', 9 | 10 | }, 11 | 12 | onLoad: function (options) { 13 | 14 | this.setData({ 15 | video:options.video, 16 | headerName: options.headerName, 17 | headerImage: options.headerImage, 18 | headerContent: options.headerContent, 19 | }); 20 | 21 | wx.setNavigationBarTitle({ 22 | title: options.headerName, 23 | }) 24 | console.log(this.item); 25 | 26 | } 27 | 28 | }) -------------------------------------------------------------------------------- /pages/videoDetail/videoDetail.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /pages/videoDetail/videoDetail.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {{headerName}} 9 | {{headerContent}} 10 | 11 | 12 | -------------------------------------------------------------------------------- /pages/videoDetail/videoDetail.wxss: -------------------------------------------------------------------------------- 1 | 2 | video{ 3 | width: 100%; 4 | } 5 | 6 | .headerContainer{ 7 | background-color: 'red'; 8 | padding: 5px; 9 | font-size: 14.0px; 10 | width: 100%; 11 | height: 60px; 12 | flex-direction:row; 13 | display: inline-flex; 14 | } 15 | 16 | .headerSubContainer{ 17 | width: 240px; 18 | padding-left: 5px; 19 | display: inline-flex; 20 | flex-direction:column; 21 | justify-content: center; 22 | } 23 | 24 | .headerImage{ 25 | width: 50px; 26 | height: 50px; 27 | margin: 0px; 28 | border-radius: 25px; 29 | } 30 | 31 | .contentText{ 32 | color: '#222333'; 33 | width:730rpx 34 | } 35 | 36 | .subText{ 37 | color: 'red' 38 | } -------------------------------------------------------------------------------- /pics/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/pics/.DS_Store -------------------------------------------------------------------------------- /pics/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/pics/1.png -------------------------------------------------------------------------------- /pics/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/pics/2.png -------------------------------------------------------------------------------- /pics/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/pics/3.png -------------------------------------------------------------------------------- /pics/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/pics/4.png -------------------------------------------------------------------------------- /pics/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coder4why/LZKKDemo/9f48aa8eed9d84e1ee7602a8b2da61426df095c5/pics/5.png -------------------------------------------------------------------------------- /project.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": "项目配置文件", 3 | "packOptions": { 4 | "ignore": [] 5 | }, 6 | "setting": { 7 | "urlCheck": true, 8 | "es6": true, 9 | "postcss": true, 10 | "minified": true, 11 | "newFeature": true, 12 | "autoAudits": false 13 | }, 14 | "compileType": "miniprogram", 15 | "libVersion": "2.6.6", 16 | "appid": "wx5732e992032a5c6a", 17 | "projectname": "002", 18 | "debugOptions": { 19 | "hidedInDevtools": [] 20 | }, 21 | "isGameTourist": false, 22 | "simulatorType": "wechat", 23 | "simulatorPluginLibVersion": {}, 24 | "condition": { 25 | "search": { 26 | "current": -1, 27 | "list": [] 28 | }, 29 | "conversation": { 30 | "current": -1, 31 | "list": [] 32 | }, 33 | "game": { 34 | "currentL": -1, 35 | "list": [] 36 | }, 37 | "miniprogram": { 38 | "current": -1, 39 | "list": [] 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /sitemap.json: -------------------------------------------------------------------------------- 1 | { 2 | "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html", 3 | "rules": [{ 4 | "action": "allow", 5 | "page": "*" 6 | }] 7 | } --------------------------------------------------------------------------------