2017/12/20 0:00:00
泉源:不详
作者:未知
想学一下
微信小程序,,发明文档这工具,,干看真没啥意思。。以是妄想自己先下手撸一个。。摩拜单车有自己的小程序,,基本功效都有,,利便又小巧,,甚是喜欢。。于是我就萌生了一个给ofo共享单车撸一个小程序(不知道为啥ofo没有小程序)的想法。。
这一节我们先来剖析一下小程序的地图组件
1.准备事情
微信小程序虽然属于腾讯大佬的(给大佬递茶):
微信小程序开发者工具下载,,腾讯开放了小程序个人开发平台,,只需要一个微信号就可以成为小程序开发者了。。
2.小程序页面
翻开小程序开发者工具,,用微信扫码登录,,建设一个默认的小程序。。
pages文件夹下存放着小程序所有的营业页面;;;;;;
index文件夹就是一个页面,,index.wxml是页面的结构文件,,类似html。。
index.wxss是页面的样式,,着实就是css;;;;;;index.js是页面的逻辑,,数据请求与渲染都是都在这个页面完成。。
logs文件夹存放着小程序开发日志,,现在暂时用不到。。
utils.js可以编写自己的JavaScript插件也可以引入第三方插件。。
app.js处理全局的一些逻辑,,好比界说全局变量存放获取的用户信息,,这样每个页面都可以获取用户信息。。
app.json 是全局设置文件,,好比设置问题栏的配景致等。。
app.wxss 存放页面的公共样式,,若是多个页面需要用到统一样式,,就可以写在这里。。
调试按钮用来举行调试,,功效和chrome dev调试工具差未几。。
项目按钮显示预览二维码,,用于真机调试。。
必需真机调试测试代码,,自带的调试工具有时间会出bug
3.建设页面结构
上一节已经剖析了默认的文件结构以及它们的功效,,现在我们要建设ofo小程序所需要的页面。。
删除pages下默认的index文件夹,,logs/utils文件夹可选择性删除
在与pages同级目录下建设images文件夹,,存放页面需要用到的图标,,下载图标
本小程序不需要在app.js内里编写内容,,可以先注释这内里的代码
在app.json里,,删掉默认代码,,编写如下代码(
注:app.json文件里不可有任何注释,,这里是为了形貌页面功效更直观):
-
{
-
"pages":[
-
"pages/index/index", // 地图页
-
"pages/warn/index", // 车辆报障页
-
"pages/scanresult/index", // 扫码乐成页
-
"pages/billing/index", // 最先计费页
-
"pages/my/index", // 账户页
-
"pages/wallet/index", // 钱包页
-
"pages/charge/index", // 充值页
-
"pages/logs/logs" // 日志页
-
],
-
"window":{
-
"backgroundTextStyle":"light",
-
"navigationBarBackgroundColor": "#b9dd08", // 问题栏配景致
-
"navigationBarTitleText": "ofo 共享单车", // 问题栏文字
-
"navigationBarTextStyle":"black" // 问题栏文字样式
-
}
-
}
复制代码
在app.wxss内里。。我们先把页面的通用样式给出来(这一步我是在所有页面写完后,,发明有些页面有着相同的样式,,再把公共样式抽离出来放在app.wxss内里的。。)
-
/**app.wxss**/
-
.container{
-
background-color: #f2f2f2;
-
height: 100vh;
-
}
-
.title{
-
background-color: #f2f2f2;
-
padding: 30rpx 0 30rpx 50rpx;
-
font-size: 28rpx;
-
color: #000;
-
}
-
.tapbar{
-
display: flex;
-
align-items: center;
-
justify-content: space-between;
-
background-color: #fff;
-
padding: 40rpx;
-
}
-
.btn-charge{
-
width: 90%;
-
background-color: #b9dd08;
-
margin: 40rpx auto 30rpx;
-
text-align: center;
-
}
生涯后,,你的pages文件夹下就是这样的界面了(在app.json下建设路径会自动建设文件夹,,贼利便):
2.PNG (8.98 KB, 下载次数: 7)
下载附件 生涯到相册
2017-6-5 14:19 上传
4.编写地图首页 (index文件夹)
先来看一下地图首页效果图
Screenshot_2017-05-07-10-13-42-983_com.tencent.mm.png (950 KB, 下载次数: 6)
下载附件 生涯到相册
2017-6-5 14:20 上传
页面剖析:
-
整页显示地图,,宽高占手机窗口的100%
-
地图之上有五个按钮图标和多个黄色ofo标记:定位按钮,,连忙用车按钮,,举报按钮,,黄色头像按钮和位于地图中心的定位标记。。
要在页面显示地图,,我们需要在index.wxml引入地图组件:
-
<!--index.wxml-->
-
<view class="container">
-
<map id="ofoMap"
-
latitude="{{latitude}}" // 纬度
-
longitude="{{longitude}}" // 经度
-
scale="{{scale}}" // 缩放级别
-
show-location/> // 显示带有偏向的小圆点
-
</view>
复制代码
{{...}} 内里是模板数据,,待会会在index.js里的data工具内里界说。。
初始化模板数据,,在index.js的data工具里添加如下代码:
-
//index.js
-
Page({
-
data: {
-
scale: 18, // 缩放级别,,默认18,,数值在0~18之间
-
latitude: 0, // 给个默认值
-
longitude: 0 // 给个默认值
-
},
-
onLoad: function(options){
-
// 1.页面初始化 options为页面跳转所带来的参数
-
},
-
onReady: function(){
-
// 页面渲染完成
-
},
-
onShow: function(){
-
// 页面显示
-
},
-
onHide: function(){
-
// 页面隐藏
-
},
-
onUnload: function(){
-
// 页面关闭
复制代码
这样pp电子地图就默认中心位置为经度 0,,纬度0。。虽然可能在开发者工具里显示不出来(有bug)。。莫慌!由于这不是我们想要的,,我们想要的是我们自己的位置,,以是得先获取我们目今所在位置的经纬度,,在index.js里的onLoad要领里添加如下代码:
-
onLoad: function(options){
-
// 1.页面初始化 options为页面跳转所带来的参数
-
-
// 2.挪用wx.getLocation系统API,获取并设置目今位置经纬度
-
wx.getLocation({
-
type: "gcj02", // 坐标系类型
-
// 获取经纬度乐成回调
-
success: (res) => { // es6 箭头函数,,可以解绑目今作用域的this指向,,使得下面的this可以绑定到Page工具
-
this.setData({ // 为data工具里界说的经纬度默认值设置成获取到的真实经纬度,,这样就可以在地图上显示pp电子真实位置
-
longitude: res.longitude,
-
latitude: res.latitude
-
})
-
}
-
});
复制代码
tips:res是一参数工具,,它是由挪用的对应API传过来的,,若是你想知道res的详细值,,可以在乐成回调函数里打。。篶onsole.log(res),,然后在控制台输出,,看看它包括什么内容。。在挪用一个生疏API的时间可以用这种要领审查返回的工具数据,,对处理逻辑很有资助。。
我们在地图上显示了pp电子真实位置,,但没有移动到页面的中心位置,,微信提供的wx.moveToLocation()函数可以把目今位置移动到地图中心。。修改index.js:
-
//index.js
-
Page({
-
data: {
-
scale: 18,
-
latitude: 0,
-
longitude: 0
-
},
-
// 页面加载
-
onLoad: function(options){
-
// 1.页面初始化 options为页面跳转所带来的参数
-
-
// 2.挪用wx.getLocation系统API,获取并设置目今位置经纬度
-
wx.getLocation({
-
type: "gcj02", // 坐标系类型
-
// 获取经纬度乐成回调
-
success: (res) => { // es6 箭头函数,,可以解绑目今作用域的this指向,,使得下面的this可以绑定到Page工具
-
this.setData({ // 为data工具里界说的经纬度默认值设置成获取到的真实经纬度,,这样就可以在地图上显示pp电子真实位置
-
longitude: res.longitude,
-
latitude: res.latitude
-
})
-
}
-
});
-
}
-
// 页面显示
-
onShow: function(){
-
// 1.建设地图上下文,,移动目今位置到地图中心
-
this.mapCtx = wx.createMapContext("ofoMap"); // 地图组件的id
-
this.movetoPosition()
-
},
-
// 定位函数,,移动位置到地图中心
-
movetoPosition: function(){
-
this.mapCtx.moveToLocation();
-
}
-
})
复制代码
我们在onShow函数里为地图组件(id为ofoMap)建设了一个地图上下文,,挪用了自界说函数movetoPosition(),,而在自界说函数里又挪用了moveToLocation这个API,,这样,,页面一显示就在地图中心显示目今位置。。
我们地图上定位了pp电子真实位置,,但地图组件照旧默认样式(点击调试,,右侧面板点击wxml可以审查地图组件的默认名堂),,以是我们为地图组件添加样式,,在index.wxss里编写样式:
-
/**index.wxss**/
-
.container{
-
position: relative;
-
width: 100%; // 宽度占满装备
-
height: 100vh; // 高度占满装备
-
}
-
#ofoMap{
-
position: absolute;
-
left: 0;
-
top: 0;
-
right: 0;
-
bottom: 0;
-
width: 100%;
-
height: 100%;
复制代码
生涯刷新,,整个屏幕就都显示地图了>_<
我们再来添加地图上的按钮
着实这里的按钮不是真正的按钮,,它们属于地图上的控件属性,,并且不随着地图移动。。这里有一个坑:
地图组件属于微信原生组件,,层级最高,,任何元素都不可在地图之上显示,,即无论设置多大z-index都无法显示。。以是,,要想在地图上添加按钮来知足需求,,就要用到地图控件属性。。
要添加地图控件,,先在地图组件里声明controls="...":
复制代码
然后在index.js设置controls(看代码注释相识详细用法)
-
//index.js
-
Page({
-
data: {
-
scale: 18,
-
latitude: 0,
-
longitude: 0
-
},
-
// 页面加载
-
onLoad: function(options){
-
// 1.页面初始化 options为页面跳转所带来的参数
-
-
// 2.挪用wx.getLocation系统API,获取并设置目今位置经纬度
-
...已省略
-
-
// 3.设置地图控件的位置及大。。,通过装备宽高定位
-
wx.getSystemInfo({ // 系统API,获取系统信息,,好比装备宽高
-
success: (res) => {
-
this.setData({
-
// 界说控件数组,,可以在data工具初始化为[],也可以不初始化,,取决于是否需要更好的阅读
-
controls: [{
-
id: 1, // 给控件界说唯一id
-
iconPath: '/images/location.png', // 控件图标
-
position: { // 控件位置
-
left: 20, // 单位px
-
top: res.windowHeight - 80, // 凭证装备高度设置top值,,可以做到在差别装备上效果一致
-
width: 50, // 控件宽度/px
-
height: 50 // 控件高度/px
-
},
-
clickable: true // 是否可点击,,默以为true,可点击
-
},
-
{
-
id: 2,
-
iconPath: '/images/use.png',
-
position: {
-
left: res.windowWidth/2 - 45,
-
top: res.windowHeight - 100,
-
width: 90,
-
height: 90
-
},
-
clickable: true
-
},
-
{
-
id: 3,
-
iconPath: '/images/warn.png',
-
position: {
-
left: res.windowWidth - 70,
-
top: res.windowHeight - 80,
-
width: 50,
-
height: 50
-
},
-
clickable: true
-
},
-
{
-
id: 4,
-
iconPath: '/images/marker.png',
-
position: {
-
left: res.windowWidth/2 - 11,
-
top: res.windowHeight/2 - 45,
-
width: 22,
-
height: 45
-
},
-
clickable: false
-
},
-
{
-
id: 5,
-
iconPath: '/images/avatar.png',
-
position: {
-
left: res.windowWidth - 68,
-
top: res.windowHeight - 155,
-
width: 45,
-
height: 45
-
},
-
clickable: true
-
}]
-
})
-
}
-
});
-
}
-
// 页面显示
-
onShow: function(){
-
...已省略
-
},
-
// 定位函数,,移动位置到地图中心
-
movetoPosition: function(){
-
this.mapCtx.moveToLocation();
-
}
-
})
复制代码
tips: 我们在给控件设置top,left值时,,用到了装备宽高。。这样的话pp电子控件位置就会在所有差别比例的装备上显示相同的效果了
我们再为地图控件绑定事务
现在地图上总共有四个图标可点击(地图中心的标记控件不需要点击,,是用来指示中心位置的),,所有我们需要为每个控件绑定差别的事务以实现差别的功效:
-
点击定位控件,,定位目今位置到地图中心,,由于用户在拖动地图,,有时需要回到目今所在位置。。
-
点击连忙用车控件,,挪用微信内置扫码功效。。然后获取开锁密码。。
-
点击举报按钮,,前往维修报障页面。。
-
点击用户头像按钮,,前往登录页面举行登录,,审查余额,,充值等操作
为控件绑定事务,,同样需要在地图控件举行声明:
-
<!--index.wxml-->
-
<view class="container">
-
<map id="ofoMap"
-
latitude="{{latitude}}" // 纬度
-
longitude="{{longitude}}" // 经度
-
scale="{{scale}}" // 缩放级别
-
controls="{{controls}}" // 地图控件数组,,多个控件存放在数组里
-
bindcontroltap="bindcontroltap" // 控件点击事务
-
show-location/> // 显示带有偏向的小圆点
-
</view>
复制代码
注重: bindcontroltap事务会响应所有控件的点击,,以是,,我们需要凭证控件id来区分控件,,然后响应差别的事务。。这就是为什么要给控件设置id。。
在index.js添加bindcontroltap事务:
-
//index.js
-
Page({
-
data: {
-
scale: 18,
-
latitude: 0,
-
longitude: 0
-
},
-
// 页面加载
-
onLoad: function(options){
-
// 1.获取准时器,,用于判断是否已经在计费
-
this.timer = options.timer;
-
-
// 2.挪用wx.getLocation系统API,获取并设置目今位置经纬度
-
...已省略
-
-
// 3.设置地图控件的位置及大。。,通过装备宽高定位
-
...已省略
-
}
-
// 地图控件点击事务
-
bindcontroltap: function(e){
-
// 判断点击的是哪个控件 e.controlId的值是目今点击控件的id。。
-
switch(e.controlId){
-
// 点击定位控件
-
case 1: this.movetoPosition();
-
break;
-
// 点击连忙用车,,判断目今是否正在计费,,此处只需要知道是挪用扫码,,后面会讲到这里的判断条件
-
case 2: if(this.timer === "" || this.timer === undefined){
-
// 没有在计费就扫码
-
wx.scanCode({
-
success: (res) => {
-
// 正在获取密码通知
-
wx.showLoading({
-
title: '正在获取密码',
-
mask: true // 显示蒙层
-
})
-
// 请求服务器获取密码和车号
-
wx.request({
-
url: 'https://www.easy-mock.com/mock/59098d007a878d73716e966f/ofodata/password',
-
data: {},
-
method: 'GET',
-
success: function(res){
-
// 请求密码乐成隐藏期待框
-
wx.hideLoading();
-
// 携带密码和车号跳转到密码页
-
wx.redirectTo({
-
url: '../scanresult/index?password=' + res.data.data.password + '&number=' + res.data.data.number,
-
success: function(res){
-
wx.showToast({
-
title: '获取密码乐成',
-
duration: 1000
-
})
-
}
-
})
-
}
-
})
-
}
-
})
-
// 目今已经在计费就回退到计费页
-
}else{
-
wx.navigateBack({
-
delta: 1
-
})
-
}
-
break;
-
// 点击包管控件,,跳转到报障页
-
case 3: wx.navigateTo({
-
url: '../warn/index'
-
});
-
break;
-
// 点击头像控件,,跳转到个人中心
-
case 5: wx.navigateTo({
-
url: '../my/index'
-
});
-
break;
-
default: break;
-
}
-
},
-
// 页面显示
-
onShow: function(){
-
...已省略
-
},
-
// 定位函数,,移动位置到地图中心
-
movetoPosition: function(){
-
this.mapCtx.moveToLocation();
-
}
-
})
复制代码
这里用到的API:
扫码API: wx.scanCode({})
显示加载框: wx.showLoading()
隐藏加载框: wx.hideLoading()
显示提醒框: wx.showToast()
隐藏提醒框: wx.hideToast()
向服务器发送请求:wx.request({})
关闭目今页面,,跳转到指定页面: wx.redirectTo({})
保存目今页面,,跳转到指定页面: wx.navigateTo({})
回退到指定页面: wx.naivgateBack({})
审查详细用法,,审查官方API文档
tips: 跳转页面传参示例:
-
let num = 1;
-
wx.navigateTo({
-
url: '../other/index?num=' + num
-
});
-
// other页面onLoad接受参数
-
onLoad: function(options){
-
console.log(options.num); // 1
-
}
-
// 多个参数用&脱离,,如 'index?num=' + num + '&text=' + 'text'
-
复制代码
我们现在在地图上添加单车标记makers和位置连线,照旧在地图组件里先声明:
-
<!--index.wxml-->
-
<view class="container">
-
<map id="ofoMap"
-
latitude="{{latitude}}" // 纬度
-
longitude="{{longitude}}" // 经度
-
scale="{{scale}}" // 缩放级别
-
controls="{{controls}}" // 地图控件数组,,多个控件存放在数组里
-
bindcontroltap="bindcontroltap" // 控件点击事务
-
polyline="{{polyline}}" // 位置连线
-
markers="{{markers}}" // 标记数组
-
bindmarkertap="bindmarkertap" // 标记点击事务
-
show-location/> // 显示带有偏向的小圆点
-
</view>
复制代码
然后在index.js里界说:
-
//index.js
-
Page({
-
data: {
-
scale: 18,
-
latitude: 0,
-
longitude: 0
-
},
-
// 页面加载
-
onLoad: function(options){
-
// 1.获取准时器,,用于判断是否已经在计费
-
this.timer = options.timer;
-
-
// 2.挪用wx.getLocation系统API,获取并设置目今位置经纬度
-
...已省略
-
-
// 3.设置地图控件的位置及大。。,通过装备宽高定位
-
...已省略
-
-
// 4.请求服务器,,显示周围的单车,,用marker标记
-
wx.request({
-
url: 'https://www.easy-mock.com/mock/59098d007a878d73716e966f/ofodata/biyclePosition',
-
data: {},
-
method: 'GET',
-
// header: {}, // 设置请求的 header
-
success: (res) => {
-
this.setData({
-
markers: res.data.data
-
})
-
}
-
})
-
}
-
// 地图控件点击事务
-
bindcontroltap: function(e){
-
...已省略
-
},
-
// 地图标记点击事务,,毗连用户位置和点击的单车位置
-
bindmarkertap: function(e){
-
let _markers = this.data.markers; // 拿到标记数组
-
let markerId = e.markerId; // 获取点击的标记id
-
let currMaker = _markers[markerId]; // 通过id,获取目今点击的标记
-
this.setData({
-
polyline: [{
-
points: [{ // 连线起点
-
longitude: this.data.longitude,
-
latitude: this.data.latitude
-
}, { // 连线终点(目今点击的标记)
-
longitude: currMaker.longitude,
-
latitude: currMaker.latitude
-
}],
-
color:"#FF0000DD", // 连线颜色
-
width: 1, // 连线宽度
-
dottedLine: true // 虚线
-
}],
-
scale: 18
-
})
-
},
-
// 页面显示
-
onShow: function(){
-
...已省略
-
},
-
// 定位函数,,移动位置到地图中心
-
movetoPosition: function(){
-
this.mapCtx.moveToLocation();
-
}
-
})
复制代码
我在easy-mock上伪造了一些单车的经纬度,,是基于我自己的位置。。你可以在你周围设置经纬度,,使用easy-mock伪造。。???梢钥匆幌挛业氖菝茫,单车经纬度接口
接下来我们为用户拖动地图绑定事务
我们已经为地图控件和标记响应了差别的事务,,现在若是用户拖动地图,,我们需要在拖动周围显示单车,,先在地图组件声明地图拖动事务:
-
<!--index.wxml-->
-
<view class="container">
-
<map id="ofoMap"
-
latitude="{{latitude}}" // 纬度
-
longitude="{{longitude}}" // 经度
-
scale="{{scale}}" // 缩放级别
-
controls="{{controls}}" // 地图控件数组,,多个控件存放在数组里
-
bindcontroltap="bindcontroltap" // 控件点击事务
-
polyline="{{polyline}}" // 位置连线
-
markers="{{markers}}" // 标记数组
-
bindmarkertap="bindmarkertap" // 标记点击事务
-
bindregionchange="bindregionchange" // 拖动地图事务
-
show-location/> // 显示带有偏向的小圆点
-
</view>
-
复制代码
然后在index.js里实现这个事务要领:
-
//index.js
-
Page({
-
data: {
-
scale: 18,
-
latitude: 0,
-
longitude: 0
-
},
-
// 页面加载
-
onLoad: function(options){
-
// 1.获取准时器,,用于判断是否已经在计费
-
this.timer = options.timer;
-
-
// 2.挪用wx.getLocation系统API,获取并设置目今位置经纬度
-
...已省略
-
-
// 3.设置地图控件的位置及大。。,通过装备宽高定位
-
...已省略
-
-
// 4.请求服务器,,显示周围的单车,,用marker标记
-
...已省略
-
}
-
// 地图控件点击事务
-
bindcontroltap: function(e){
-
...已省略
-
},
-
// 拖动地图事务
-
bindregionchange: function(e){
-
// 拖动地图,,获取附件单车位置
-
if(e.type == "begin"){
-
wx.request({
-
url: 'https://www.easy-mock.com/mock/59098d007a878d73716e966f/ofodata/biyclePosition',
-
data: {},
-
method: 'GET',
-
success: (res) => {
-
this.setData({
-
_markers: res.data.data
-
})
-
}
-
})
-
// 阻止拖动,,显示单车位置
-
}else if(e.type == "end"){
-
this.setData({
-
markers: this.data._markers
-
})
-
}
-
},
-
// 地图标记点击事务,,毗连用户位置和点击的单车位置
-
bindmarkertap: function(e){
-
...已省略
-
},
-
// 页面显示
-
onShow: function(){
-
...已省略
-
},
-
// 定位函数,,移动位置到地图中心
-
movetoPosition: function(){
-
this.mapCtx.moveToLocation();
-
}
-
})
复制代码
至此,,首页地图已经完成了,,下一节我们要编写响应的跳转页面
其他章节
微信小程序开发之OFO共享单车——扫码
微信小程序开发之OFO共享单车——单车报障页
微信小程序开发之OFO共享单车——个人中心页
微信小程序开发之OFO共享单车——钱包与充值
【本站声明】
1、本站文章中所选用的图片及文字泉源于网络以及用户投稿,,由于未联系到知识产权人或未发明有关知识产权的挂号,,若有知识产权人并不肯意我们使用,,若是有侵权请连忙联系。。
2、本网站差池文章中所涉及的内容真实性、准确性、可靠性认真,,仅系客观性形貌,,如您需要相识该类商品/服务详细的资讯,,请您直接与该类商品/服务的提供者联系。。
KESION pp电子软件
KESION pp电子软件是海内领先的在线教育软件及私域社交电商软件服务提供商,,恒久专注于为企业提供在线教育软件及社交电商SaaS平台解决方案。。
公司焦点产品云开店SaaS社交电商服务平台、在线教育SaaS服务平台、教育企业数字化SaaS云平台、企微营销助手、私有化自力安排品牌网校和在线教育咨询等。。KESION 一直通过手艺立异,,提供产品和服务,,助力企业向数字化转型,,通过科技驱动商业刷新,,让商业变得更智慧!