微信小程序開發(fā)之OFO共享單車,微信小程序掃描二維碼
2017-12-20
導(dǎo)讀:上一節(jié)我們實(shí)現(xiàn)首頁地圖,也響應(yīng)了控件點(diǎn)擊和用戶拖動(dòng)地圖事件。這一節(jié)我們實(shí)現(xiàn)一下點(diǎn)擊立即用車掃碼成功之后的頁面邏輯。 這里我用了我自己微信號的二維碼,你們可以用你們自...
上一節(jié)我們實(shí)現(xiàn)首頁地圖,也響應(yīng)了控件點(diǎn)擊和用戶拖動(dòng)地圖事件。這一節(jié)我們實(shí)現(xiàn)一下點(diǎn)擊立即用車掃碼成功之后的頁面邏輯。
這里我用了我自己微信號的二維碼,你們可以用你們自己的,掃碼成功后的頁面是醬的:
頁面分析
頁面布局
復(fù)制代碼
微信小程序的頁面元素有自己的一套名字,用的是weui設(shè)計(jì)風(fēng)格,但是元素種類比較少,比如說<view>就代表著<div>,<text>是行內(nèi)元素,<image>是圖片標(biāo)簽等,所以頁面標(biāo)簽這一塊只要有html基礎(chǔ)就很容易理解
頁面樣式
復(fù)制代碼
樣式方面完全是css,注意這里的單位是rpx,是小程序?yàn)榱俗赃m應(yīng)所有設(shè)備而設(shè)定的單位,按寬度為750px的設(shè)備計(jì)算,1rpx = 0.5px。其他比例換算可以看官方文檔。
先來了解兩個(gè)知識點(diǎn):
先來回頭看一下首頁地圖立即用車事件代碼,如果當(dāng)前沒有在計(jì)費(fèi),將可以掃碼,掃碼成功后將會傳遞參數(shù)(密碼和車牌號)并跳轉(zhuǎn)到../scanresult/index,也就是本頁面。
復(fù)制代碼
我們在js里面寫下如下代碼,本頁面的options就是上面?zhèn)鬟f過來的參數(shù)。試試打印出來是什么!
復(fù)制代碼
當(dāng)?shù)褂?jì)時(shí)完成之后,就應(yīng)該自動(dòng)跳轉(zhuǎn)到計(jì)費(fèi)頁:
頁面分析
頁面結(jié)構(gòu)(看看我們哪些是數(shù)據(jù)模板?,為元素綁定了什么事件?)
復(fù)制代碼
頁面樣式
復(fù)制代碼
數(shù)據(jù)邏輯(看注釋更好理解哦)
頁面分析的第4步,主要實(shí)現(xiàn)在moveToIndex函數(shù)里。結(jié)束騎行之后,設(shè)置定時(shí)器值為空,當(dāng)點(diǎn)擊回到地圖時(shí)判斷計(jì)時(shí)器的狀態(tài)(值是否為空)。如果為空,關(guān)閉計(jì)費(fèi)頁,結(jié)束本次騎行。如果不為空,攜帶定時(shí)器狀態(tài)跳轉(zhuǎn)到首頁,首頁立即用車點(diǎn)擊事件就會對傳過來的參數(shù)(計(jì)時(shí)器狀態(tài))響應(yīng)合理邏輯。再回去上面看一下立即用車的判斷條件,當(dāng)本頁面?zhèn)鬟^去的計(jì)時(shí)器不滿足條件時(shí),我們在地圖首頁點(diǎn)擊立即用車將會回到本頁面
其他章節(jié)
微信小程序開發(fā)之OFO共享單車——掃碼
微信小程序開發(fā)之OFO共享單車——單車報(bào)障頁
微信小程序開發(fā)之OFO共享單車——個(gè)人中心頁
微信小程序開發(fā)之OFO共享單車——錢包與充值
這里我用了我自己微信號的二維碼,你們可以用你們自己的,掃碼成功后的頁面是醬的:
頁面分析
- 后臺需要拿到開鎖密碼,然后顯示在頁面上
- 我們需要一個(gè)定時(shí)器,規(guī)定多長時(shí)間用來檢查單車是否損壞,這期間如果單車故障,可以點(diǎn)擊回首頁去車輛報(bào)障,當(dāng)然也就取消了本次掃碼。
- 如果單車沒有問題,檢查時(shí)長完成后,自動(dòng)跳轉(zhuǎn)到計(jì)費(fèi)頁面
頁面布局
- <!--pages/scanresult/index.wxml-->
- <view class="container">
- <view class="password-title">
- <text>開鎖密碼</text>
- </view>
- <view class="password-content">
- <text>{{password}}</text>
- </view>
- <view class="tips">
- <text>請使用密碼解鎖,{{time}}s后開始計(jì)費(fèi)</text>
- <view class="tips-action" bindtap="moveToWarn">
- 車輛有問題?
- <text class="tips-href">回首頁去車輛報(bào)障</text>
- </view>
- </view>
- </view>
微信小程序的頁面元素有自己的一套名字,用的是weui設(shè)計(jì)風(fēng)格,但是元素種類比較少,比如說<view>就代表著<div>,<text>是行內(nèi)元素,<image>是圖片標(biāo)簽等,所以頁面標(biāo)簽這一塊只要有html基礎(chǔ)就很容易理解
頁面樣式
- .container{
- width: 100%;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: space-between;
- background-color: #fff;
- }
- .password-title,.tips{
- width: 100%;
- flex: 1;
- text-align: center;
- padding: 60rpx 0;
- }
- .password-content{
- width: 100%;
- flex: 8;
- text-align: center;
- font-size: 240rpx;
- font-weight: 900;
- }
- .tips{
- font-size: 32rpx;
- }
- .tips .tips-action{
- margin-top: 20rpx;
- }
- .tips .tips-href{
- color: #b9dd08
- }
樣式方面完全是css,注意這里的單位是rpx,是小程序?yàn)榱俗赃m應(yīng)所有設(shè)備而設(shè)定的單位,按寬度為750px的設(shè)備計(jì)算,1rpx = 0.5px。其他比例換算可以看官方文檔。
先來了解兩個(gè)知識點(diǎn):
- 數(shù)據(jù)渲染頁面:前面我們在地圖組件中設(shè)置了數(shù)據(jù)模板,然后在js里通過服務(wù)器獲取數(shù)據(jù)動(dòng)態(tài)給模板數(shù)據(jù)賦值,每當(dāng)js數(shù)據(jù)改變,頁面就會重新渲染數(shù)據(jù)。所以核心思想是數(shù)據(jù)驅(qū)動(dòng)頁面。我們在結(jié)構(gòu)里設(shè)置了數(shù)據(jù)模板{{time}},說明這個(gè)數(shù)據(jù)是需要我們?nèi)ジ淖兊?,所以先在data對象里賦予初始值9(為了調(diào)試方便,特意把時(shí)間調(diào)的很短)
- 為元素綁定事件:和傳統(tǒng)html里不同,小程序頁面為元素綁定事件不能操作元素,不然就違背了數(shù)據(jù)驅(qū)動(dòng)頁面的初衷,所以小程序在元素內(nèi)聲明一個(gè)變量如 bindtap="moveToWarn"來為指定元素綁定點(diǎn)擊事件,然后在js里實(shí)現(xiàn)這個(gè)事件的功能。還可以綁定很多事件類型,更多可以查閱事件文檔
先來回頭看一下首頁地圖立即用車事件代碼,如果當(dāng)前沒有在計(jì)費(fèi),將可以掃碼,掃碼成功后將會傳遞參數(shù)(密碼和車牌號)并跳轉(zhuǎn)到../scanresult/index,也就是本頁面。
- // 地圖控件點(diǎn)擊事件
- bindcontroltap: function(e){
- // 判斷點(diǎn)擊的是哪個(gè)控件 e.controlId代表控件的id,在頁面加載時(shí)的第3步設(shè)置的id
- switch(e.controlId){
- // 點(diǎn)擊定位控件
- case 1: this.movetoPosition();
- break;
- // 點(diǎn)擊立即用車,判斷當(dāng)前是否正在計(jì)費(fèi)
- case 2: if(this.timer === "" || this.timer === undefined){
- // 沒有在計(jì)費(fèi)就掃碼
- wx.scanCode({
- success: (res) => {
- // 正在獲取密碼通知
- wx.showLoading({
- title: '正在獲取密碼',
- mask: true
- })
- // 請求服務(wù)器獲取密碼和車號
- wx.request({
- url: 'https://www.easy-mock.com/mock/59098d007a878d73716e966f/ofodata/password',
- data: {},
- method: 'GET',
- success: function(res){
- // 請求密碼成功隱藏等待框
- wx.hideLoading();
- // 攜帶密碼和車號跳轉(zhuǎn)到密碼頁
- wx.redirectTo({
- url: '../scanresult/index?password=' + res.data.data.password + '&number=' + res.data.data.number,
- success: function(res){
- wx.showToast({
- title: '獲取密碼成功',
- duration: 1000
- })
- }
- })
- }
- })
- }
- })
- // 當(dāng)前已經(jīng)在計(jì)費(fèi)就回退到計(jì)費(fèi)頁
- }else{
- wx.navigateBack({
- delta: 1
- })
- }
- break;
- // 點(diǎn)擊保障控件,跳轉(zhuǎn)到報(bào)障頁
- case 3: wx.navigateTo({
- url: '../warn/index'
- });
- break;
- // 點(diǎn)擊頭像控件,跳轉(zhuǎn)到個(gè)人中心
- case 5: wx.navigateTo({
- url: '../my/index'
- });
- break;
- default: break;
- }
- },
我們在js里面寫下如下代碼,本頁面的options就是上面?zhèn)鬟f過來的參數(shù)。試試打印出來是什么!
- // pages/scanresult/index.js
- Page({
- data:{
- time: 9 // 默認(rèn)計(jì)時(shí)時(shí)長,這里設(shè)短一點(diǎn),用于調(diào)試,ofo app是90s
- },
- // 頁面加載
- onLoad:function(options){
- // 獲取密碼
- this.setData({
- password: options.password
- })
- // 設(shè)置初始計(jì)時(shí)秒數(shù)
- let time = 9;
- // 開始定時(shí)器
- this.timer = setInterval(() => {
- this.setData({
- time: -- time // 倒計(jì)時(shí)
- });
- // 讀完秒后攜帶單車號碼跳轉(zhuǎn)到計(jì)費(fèi)頁
- if(time = 0){
- clearInterval(this.timer)
- wx.redirectTo({
- url: '../billing/index?number=' + options.number
- })
- }
- },1000)
- },
- // 點(diǎn)擊去首頁報(bào)障
- moveToWarn: function(){
- // 清除定時(shí)器
- clearInterval(this.timer)
- wx.redirectTo({
- url: '../index/index'
- })
- }
- })
當(dāng)?shù)褂?jì)時(shí)完成之后,就應(yīng)該自動(dòng)跳轉(zhuǎn)到計(jì)費(fèi)頁:
頁面分析
- 后臺需要拿到單車編號,并顯示在頁面上
- 我們需要一個(gè)計(jì)時(shí)器累加騎行事件用來計(jì)費(fèi),而且可以顯示最大單位是小時(shí)
- 兩個(gè)按鈕:結(jié)束騎行,回到地圖 。其中,點(diǎn)擊結(jié)束騎行,關(guān)閉計(jì)時(shí)器,根據(jù)累計(jì)時(shí)長計(jì)費(fèi);點(diǎn)擊回到地圖,如果計(jì)時(shí)器已經(jīng)關(guān)閉了,就關(guān)閉計(jì)費(fèi)頁,跳轉(zhuǎn)到地圖。如果計(jì)時(shí)器仍然在計(jì)時(shí),保留當(dāng)前頁面,跳轉(zhuǎn)到地圖。
- 點(diǎn)擊回到地圖需要把計(jì)時(shí)器狀態(tài)帶給首頁,首頁做出判斷,判定再次點(diǎn)擊立即用車響應(yīng)合理邏輯(已經(jīng)在計(jì)費(fèi),不能重復(fù)掃碼。已經(jīng)停止計(jì)費(fèi)了,需要重新掃碼)
頁面結(jié)構(gòu)(看看我們哪些是數(shù)據(jù)模板?,為元素綁定了什么事件?)
- <!--pages/billing/index.wxml-->
- <view class="container">
- <view class="number">
- <text>當(dāng)前單車編號: {{number}}</text>
- </view>
- <view class="time">
- <view class="time-title">
- <text>{{billing}}</text>
- </view>
- <view class="time-content">
- <text>{{hours}}:{{minuters}}:{{seconds}}</text>
- </view>
- </view>
- <view class="endride">
- <button type="warn" disabled="{{disabled}}" bindtap="endRide">結(jié)束騎行</button>
- <button type="primary" bindtap="moveToIndex">回到地圖</button>
- </view>
- </view>
頁面樣式
- .container{
- width: 100%;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: space-between;
- background-color: #fff;
- }
- .number,.endride{
- padding: 60rpx 0;
- flex: 2;
- width: 100%;
- text-align: center;
- }
- .time{
- text-align: center;
- width: 100%;
- flex: 6;
- }
- .time .time-content{
- font-size: 100rpx;
- }
- .endride button{
- width: 90%;
- margin-top: 40rpx;
- }
數(shù)據(jù)邏輯(看注釋更好理解哦)
- // pages/billing/index.js
- Page({
- data:{
- hours: 0,
- minuters: 0,
- seconds: 0,
- billing: "正在計(jì)費(fèi)"
- },
- // 頁面加載
- onLoad:function(options){
- // 獲取掃碼成功頁傳過來的車牌號,再定義一個(gè)定時(shí)器
- this.setData({
- number: options.number,
- timer: this.timer
- })
- // 初始化計(jì)時(shí)器
- let s = 0;
- let m = 0;
- let h = 0;
- // 計(jì)時(shí)開始
- this.timer = setInterval(() => {
- this.setData({
- seconds: s++
- })
- if(s == 60){
- s = 0;
- m++;
- setTimeout(() => {
- this.setData({
- minuters: m
- });
- },1000)
- if(m == 60){
- m = 0;
- h++
- setTimeout(() => {
- this.setData({
- hours: h
- });
- },1000)
- }
- };
- },1000)
- },
- // 結(jié)束騎行,清除定時(shí)器
- endRide: function(){
- clearInterval(this.timer);
- this.timer = "";
- this.setData({
- billing: "本次騎行耗時(shí)",
- disabled: true
- })
- },
- // 攜帶定時(shí)器狀態(tài)回到地圖
- moveToIndex: function(){
- // 如果定時(shí)器為空
- if(this.timer == ""){
- // 關(guān)閉計(jì)費(fèi)頁跳到地圖
- wx.redirectTo({
- url: '../index/index'
- })
- // 保留計(jì)費(fèi)頁跳到地圖,帶上計(jì)時(shí)器狀態(tài)
- }else{
- wx.navigateTo({
- url: '../index/index?timer=' + this.timer
- })
- }
- }
- })
頁面分析的第4步,主要實(shí)現(xiàn)在moveToIndex函數(shù)里。結(jié)束騎行之后,設(shè)置定時(shí)器值為空,當(dāng)點(diǎn)擊回到地圖時(shí)判斷計(jì)時(shí)器的狀態(tài)(值是否為空)。如果為空,關(guān)閉計(jì)費(fèi)頁,結(jié)束本次騎行。如果不為空,攜帶定時(shí)器狀態(tài)跳轉(zhuǎn)到首頁,首頁立即用車點(diǎn)擊事件就會對傳過來的參數(shù)(計(jì)時(shí)器狀態(tài))響應(yīng)合理邏輯。再回去上面看一下立即用車的判斷條件,當(dāng)本頁面?zhèn)鬟^去的計(jì)時(shí)器不滿足條件時(shí),我們在地圖首頁點(diǎn)擊立即用車將會回到本頁面
其他章節(jié)
微信小程序開發(fā)之OFO共享單車——掃碼
微信小程序開發(fā)之OFO共享單車——單車報(bào)障頁
微信小程序開發(fā)之OFO共享單車——個(gè)人中心頁
微信小程序開發(fā)之OFO共享單車——錢包與充值
第二部分:如何開通一個(gè)小商店
您可能感興趣: