成人激情在线一区二区,天天操天天爽天天舔天天操一操,极品人妻少妇诱惑日本,美女视频黄A视频全免费,国产成人综合在线观看,国产成:a人亚洲y品,亚洲国产久久久一区二区三区,成人日韩一区二区在线观看,天天搞天天做天天操天天要

小程序模板網(wǎng)

微信小程序:ofo共享單車之地圖組件

發(fā)布時間:2017-12-11 09:26 所屬欄目:小程序開發(fā)教程

想學(xué)一下微信小程序,發(fā)現(xiàn)文檔這東西,干看真沒啥意思。所以打算自己先動手?jǐn)]一個。摩拜單車有自己的小程序,基本功能都有,方便又小巧,甚是喜愛。于是我就萌生了一個給ofo共享單車擼一個小程序(不知道為啥ofo沒有小程序)的想法。Let's do it!

由于本文篇幅過長,影響瀏覽體驗,我對這篇文章做了一下拆分,修正了一些錯誤。有需要的可以移步瀏覽 后續(xù): 有位php攻城獅根據(jù)此前端項目添加了后臺數(shù)據(jù)支持,詳情請轉(zhuǎn): http://www.jianshu.com/p/8a5687a15648

先上一波效果圖:

 
1.首頁地圖頁
 
2.維修報障頁
 
3.登錄頁
 
4.錢包余額頁
 
5.充值頁
 
6.獲取了密碼頁
 
7.計費頁

1.準(zhǔn)備工作

微信小程序當(dāng)然屬于騰訊大佬的(給大佬遞茶):微信小程序開發(fā)者工具,騰訊開放了小程序個人開發(fā)平臺,只需要一個微信號就可以成為小程序開發(fā)者了。

2.小程序頁面

打開小程序開發(fā)者工具,用微信掃碼登錄,創(chuàng)建一個默認(rèn)的小程序。界面是醬的:

 
小程序開發(fā)者工具頁面

pages文件夾下存放著小程序所有的業(yè)務(wù)頁面;

index文件夾就是一個頁面,index.wxml是頁面的結(jié)構(gòu)文件,類似html。

index.wxss是頁面的樣式,其實就是css;index.js是頁面的邏輯,數(shù)據(jù)請求與渲染都是都在這個頁面完成。

logs文件夾存放著小程序開發(fā)日志,目前暫時用不到。

utils.js可以編寫自己的JavaScript插件。

app.js處理全局的一些邏輯,比如定義全局變量存放獲取的用戶信息,這樣每個頁面都可以獲取用戶信息。

app.json 是全局配置文件,比如設(shè)置標(biāo)題欄的背景色等。

app.wxss 存放頁面的公共樣式,如果多個頁面需要用到同一樣式,就可以寫在這里。

項目按鈕顯示預(yù)覽二維碼,用于真機(jī)調(diào)試。必須真機(jī)調(diào)試測試代碼

3.創(chuàng)建頁面結(jié)構(gòu)

上一節(jié)已經(jīng)分析了默認(rèn)的文件結(jié)構(gòu)以及它們的功能,現(xiàn)在我們要創(chuàng)建ofo小程序所需要的頁面。

  • 1.刪除pages下默認(rèn)的index文件夾,logs/utils文件夾可選擇性刪除
  • 2.在與pages同級目錄下創(chuàng)建images文件夾,存放頁面需要用到的圖標(biāo),下載圖標(biāo)
  • 3.本小程序不需要在app.js里面編寫內(nèi)容,可以注釋這里面的代碼
  • 4.在app.json里,刪掉默認(rèn)代碼,編寫如下代碼(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", // 標(biāo)題欄背景色
    "navigationBarTitleText": "ofo 共享單車",  // 標(biāo)題欄文字
    "navigationBarTextStyle":"black" // 標(biāo)題欄文字樣式
  }
}
  • 5.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下創(chuàng)建路徑會自動創(chuàng)建文件夾,賊方便)


 
頁面結(jié)構(gòu)

4.編寫地圖首頁 (index文件夾)

先來回看一下效果圖


 
1.首頁地圖頁

頁面分析:

1.整頁顯示地圖,寬高占手機(jī)窗口的100%;
2.地圖之上有五個按鈕圖標(biāo)和多個黃色ofo標(biāo)記:定位按鈕,立即用車按鈕,舉報按鈕,黃色頭像按鈕和位于地圖中心的標(biāo)記。

4.1 要在整頁顯示地圖,我們可以在index.wxml引入地圖組件:

<!--index.wxml-->
<view class="container">
  <map id="ofoMap" 
    latitude="{{latitude}}"  // 緯度
    longitude="{{longitude}}"  // 經(jīng)度
    scale="{{scale}}"  // 縮放級別
    show-location/>    // 顯示帶有方向的小圓點
</view>

{{...}} 里面是數(shù)據(jù)變量,由js里的data對象定義。

4.2 初始化數(shù)據(jù),在index.js的data對象里添加如下代碼:

//index.js
Page({
  data: {
    scale: 18, // 縮放級別,默認(rèn)18,數(shù)值在0~18之間
    latitude: 0, // 給個默認(rèn)值
    longitude: 0 // 給個默認(rèn)值
  },
  onLoad:function(options){
    // 頁面初始化 options為頁面跳轉(zhuǎn)所帶來的參數(shù)
  },
  onReady:function(){
    // 頁面渲染完成
  },
  onShow:function(){
    // 頁面顯示
  },
  onHide:function(){
    // 頁面隱藏
  },
  onUnload:function(){
    // 頁面關(guān)閉
  }

這樣我們的地圖就默認(rèn)中心位置為經(jīng)度 0,緯度0。當(dāng)然可能在開發(fā)者工具里顯示不出來,莫慌!這不是我們想要的,我們想要的是我們自己的位置,所以得先獲取我們當(dāng)前所在位置的經(jīng)緯度,在index.js里的onLoad方法里添加如下代碼:

onLoad: function(options){
  // 頁面初始化 options為頁面跳轉(zhuǎn)所帶來的參數(shù)

  // 調(diào)用wx.getLocation系統(tǒng)API,獲取并設(shè)置當(dāng)前位置經(jīng)緯度
    wx.getLocation({
      type: "gcj02", // 坐標(biāo)系類型
      // 獲取經(jīng)緯度成功回調(diào)
      success: (res) => { // es6 箭頭函數(shù),可以解綁當(dāng)前作用域的this指向,使得下面的this可以綁定到Page對象
        this.setData({  // 為data對象里定義的經(jīng)緯度默認(rèn)值設(shè)置成獲取到的真實經(jīng)緯度,這樣就可以在地圖上顯示我們的真實位置
          longitude: res.longitude,
          latitude: res.latitude
        })
      }
    });
}

res是一個數(shù)據(jù)對象,它是由調(diào)用的對應(yīng)API傳過來的,如果你想知道res的具體值,可以在成功回調(diào)函數(shù)里打印,然后在控制臺輸出:console.log(res)。在調(diào)用一個陌生API的時候可以用這種方法查看返回的對象數(shù)據(jù),對處理邏輯很有幫助。

我們在地圖上顯示了我們的真實位置,但沒有移動到中心位置,wx.moveToLocation()函數(shù)可以把當(dāng)前位置移動到地圖中心。修改index.js:

//index.js
var app = getApp()
Page({
  data: {
    scale: 18,
    latitude: 0,
    longitude: 0
  },
// 頁面加載
  onLoad: function(options){
  // 1.頁面初始化 options為頁面跳轉(zhuǎn)所帶來的參數(shù)

  // 2.調(diào)用wx.getLocation系統(tǒng)API,獲取并設(shè)置當(dāng)前位置經(jīng)緯度
    wx.getLocation({
      type: "gcj02", // 坐標(biāo)系類型
      // 獲取經(jīng)緯度成功回調(diào)
      success: (res) => { // es6 箭頭函數(shù),可以解綁當(dāng)前作用域的this指向,使得下面的this可以綁定到Page對象
        this.setData({  // 為data對象里定義的經(jīng)緯度默認(rèn)值設(shè)置成獲取到的真實經(jīng)緯度,這樣就可以在地圖上顯示我們的真實位置
          longitude: res.longitude,
          latitude: res.latitude
        })
      }
    });
}
// 頁面顯示
  onShow: function(){
    // 1.創(chuàng)建地圖上下文,移動當(dāng)前位置到地圖中心
    this.mapCtx = wx.createMapContext("ofoMap"); // 地圖組件的id
    this.movetoPosition()
  },
// 定位函數(shù),移動位置到地圖中心
  movetoPosition: function(){
    this.mapCtx.moveToLocation();
  }
})

這樣,頁面一顯示就在地圖中心顯示當(dāng)前位置。

4.3 滿屏顯示地圖,在index.wxss里編寫樣式:

/**index.wxss**/
.container{
  position: relative;
  width: 100%; // 寬度占滿設(shè)備
  height: 100vh; // 高度占滿設(shè)備
}
#ofoMap{
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  width: 100%;
  height: 100%;
  z-index: 1;
}

保存刷新,整個屏幕就都顯示地圖了>_<

4.4 添加地圖上的按鈕

其實這里的按鈕不是真正的按鈕,它們屬于地圖上的控件屬性,并且不隨著地圖移動。這里有一個坑:

地圖組件屬于微信原生組件,層級最高,任何元素都不能在地圖之上顯示,即無論設(shè)置多大z-index都無法顯示。所以,要想在地圖上添加按鈕來滿足需求,就要用到地圖控件屬性。更多地圖控件屬性說明看這里

要添加地圖控件,先在地圖組件里聲明controls="...":

<!--index.wxml-->
<view class="container">
  <map id="ofoMap" 
    latitude="{{latitude}}"  // 緯度
    longitude="{{longitude}}"  // 經(jīng)度
    scale="{{scale}}"  // 縮放級別
    controls="{{controls}}" // 地圖控件數(shù)組,多個控件存放在數(shù)組里
    show-location/>    // 顯示帶有方向的小圓點
</view>

然后在index.js設(shè)置controls(代碼注釋還是挺多的)

//index.js
var app = getApp()
Page({
  data: {
    scale: 18,
    latitude: 0,
    longitude: 0
  },
// 頁面加載
  onLoad: function(options){
  // 1.頁面初始化 options為頁面跳轉(zhuǎn)所帶來的參數(shù)

  // 2.調(diào)用wx.getLocation系統(tǒng)API,獲取并設(shè)置當(dāng)前位置經(jīng)緯度
    ...已省略

  // 3.設(shè)置地圖控件的位置及大小,通過設(shè)備寬高定位
    wx.getSystemInfo({ // 系統(tǒng)API,獲取系統(tǒng)信息,比如設(shè)備寬高
      success: (res) => {
        this.setData({
          // 定義控件數(shù)組,可以在data對象初始化為[],也可以不初始化,取決于是否需要更好的閱讀
          controls: [{
            id: 1, // 給控件定義唯一id
            iconPath: '/images/location.png', // 控件圖標(biāo)
            position: { // 控件位置
              left: 20, // 單位px
              top: res.windowHeight - 80, // 根據(jù)設(shè)備高度設(shè)置top值,可以做到在不同設(shè)備上效果一致
              width: 50, // 控件寬度/px
              height: 50 // 控件高度/px
            },
            clickable: true // 是否可點擊,默認(rèn)為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(){
    ...
  },
// 定位函數(shù),移動位置到地圖中心
  movetoPosition: function(){
    this.mapCtx.moveToLocation();
  }
})

4.5 為地圖控件綁定事件

現(xiàn)在地圖上總共有四個圖標(biāo)可點擊(地圖中心的標(biāo)記控件不需要點擊),我們需要為每個控件綁定不同的事件以實現(xiàn)不同的功能:

1.點擊定位控件,觸發(fā)定位當(dāng)前位置到地圖中心,因為用戶在拖動地圖,有時需要查看當(dāng)前所在位置。

2.點擊立即用車控件,調(diào)用微信內(nèi)置掃碼功能。然后獲取開鎖密碼。

3.點擊舉報按鈕,前往維修報障頁面。

4.點擊用戶頭像按鈕,前往登錄頁面進(jìn)行登錄,查看余額,充值等操作

為控件綁定事件,需要在地圖控件進(jìn)行聲明:bindcontroltap

<!--index.wxml-->
<view class="container">
  <map id="ofoMap" 
    latitude="{{latitude}}"  // 緯度
    longitude="{{longitude}}"  // 經(jīng)度
    scale="{{scale}}"  // 縮放級別
    controls="{{controls}}" // 地圖控件數(shù)組,多個控件存放在數(shù)組里
    bindcontroltap="bindcontroltap" // 控件點擊事件
    show-location/>    // 顯示帶有方向的小圓點
</view>

注意: bindcontroltap事件會響應(yīng)所有控件的點擊,所以,我們需要根據(jù)控件id來區(qū)分控件,然后響應(yīng)不同的事件。

在index.js添加bindcontroltap事件:

//index.js
var app = getApp()
Page({
  data: {
    scale: 18,
    latitude: 0,
    longitude: 0
  },
// 頁面加載
  onLoad: function(options){
  // 1.獲取定時器,用于判斷是否已經(jīng)在計費
    this.timer = options.timer;

  // 2.調(diào)用wx.getLocation系統(tǒng)API,獲取并設(shè)置當(dāng)前位置經(jīng)緯度
    ...已省略

  // 3.設(shè)置地圖控件的位置及大小,通過設(shè)備寬高定位
    ...已省略
}
// 地圖控件點擊事件
  bindcontroltap: function(e){
    // 判斷點擊的是哪個控件 e.controlId代表控件的id,在頁面加載時的第3步設(shè)置的id
    switch(e.controlId){
      // 點擊定位控件
      case 1: this.movetoPosition();
        break;
      // 點擊立即用車,判斷當(dāng)前是否正在計費,此處只需要知道是調(diào)用掃碼,后面會講到this.timer是怎么來的
      case 2: if(this.timer === "" || this.timer === undefined){
          // 沒有在計費就掃碼
          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)在計費就回退到計費頁
        }else{
          wx.navigateBack({
            delta: 1
          })
        }  
        break;
      // 點擊保障控件,跳轉(zhuǎn)到報障頁
      case 3: wx.navigateTo({
          url: '../warn/index'
        });
        break;
      // 點擊頭像控件,跳轉(zhuǎn)到個人中心
      case 5: wx.navigateTo({
          url: '../my/index'
        });
        break; 
      default: break;
    }
  },
// 頁面顯示
  onShow: function(){
    ...已省略
  },
// 定位函數(shù),移動位置到地圖中心
  movetoPosition: function(){
    this.mapCtx.moveToLocation();
  }
})

這里用到的API:
掃碼API: wx.scanCode({})
顯示加載框: wx.showLoading()
隱藏加載框: wx.hideLoading()
顯示提示框: wx.showToast()
隱藏提示框: wx.hideToast()
向服務(wù)器發(fā)送請求:wx.request({})
關(guān)閉當(dāng)前頁面,跳轉(zhuǎn)到指定頁面: wx.redirectTo({})
保留當(dāng)前頁面,跳轉(zhuǎn)到指定頁面: wx.navigateTo({})
回退到指定頁面: wx.naivgateBack({})

查看詳細(xì)用法,查看官方API文檔

tips: 跳轉(zhuǎn)頁面?zhèn)鲄⑹纠?/p>

 
let num = 1;
wx.navigateTo({
    url: '../other/index?num=' + num
 });
// other頁面
onLoad: function(options){
    console.log(options.num); // 1
}

多個參數(shù)用&分隔,如 'index?num=' + num + '&text=' + 'text'

4.6 在地圖上添加單車標(biāo)記makers和位置連線,還是在地圖組件里先聲明:

<!--index.wxml-->
<view class="container">
  <map id="ofoMap" 
    latitude="{{latitude}}"  // 緯度
    longitude="{{longitude}}"  // 經(jīng)度
    scale="{{scale}}"  // 縮放級別
    controls="{{controls}}" // 地圖控件數(shù)組,多個控件存放在數(shù)組里
    bindcontroltap="bindcontroltap" // 控件點擊事件
    polyline="{{polyline}}"  // 位置連線
    markers="{{markers}}" // 標(biāo)記數(shù)組
    bindmarkertap="bindmarkertap" // 標(biāo)記點擊事件
    show-location/>    // 顯示帶有方向的小圓點
</view>

然后在index.js里定義:

//index.js
var app = getApp()
Page({
  data: {
    scale: 18,
    latitude: 0,
    longitude: 0
  },
// 頁面加載
  onLoad: function(options){
  // 1.獲取定時器,用于判斷是否已經(jīng)在計費
    this.timer = options.timer;

  // 2.調(diào)用wx.getLocation系統(tǒng)API,獲取并設(shè)置當(dāng)前位置經(jīng)緯度
    ...已省略

  // 3.設(shè)置地圖控件的位置及大小,通過設(shè)備寬高定位
    ...已省略

  // 4.請求服務(wù)器,顯示附近的單車,用marker標(biāo)記
    wx.request({
      url: 'https://www.easy-mock.com/mock/59098d007a878d73716e966f/ofodata/biyclePosition',
      data: {},
      method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
      // header: {}, // 設(shè)置請求的 header
      success: (res) => {
          this.setData({
            markers: res.data.data
          })
      }
    })
}
// 地圖控件點擊事件
  bindcontroltap: function(e){
    ...已省略
  },
// 地圖標(biāo)記點擊事件,連接用戶位置和點擊的單車位置
  bindmarkertap: function(e){
    let _markers = this.data.markers; // 拿到標(biāo)記數(shù)組
    let markerId = e.markerId; // 獲取點擊的標(biāo)記id
    let currMaker = _markers[markerId]; // 通過id,獲取當(dāng)前點擊的標(biāo)記
    this.setData({
      polyline: [{
        points: [{ // 連線起點
          longitude: this.data.longitude,
          latitude: this.data.latitude
        }, { // 連線終點(當(dāng)前點擊的標(biāo)記)
          longitude: currMaker.longitude,
          latitude: currMaker.latitude
        }],
        color:"#FF0000DD",
        width: 1,
        dottedLine: true
      }],
      scale: 18
    })
  },
// 頁面顯示
  onShow: function(){
    ...已省略
  },
// 定位函數(shù),移動位置到地圖中心
  movetoPosition: function(){
    this.mapCtx.moveToLocation();
  }
})

4.7 用戶拖動地圖事件

我們已經(jīng)為地圖控件和標(biāo)記響應(yīng)了不同的事件,現(xiàn)在如果用戶拖動地圖,我們需要在拖動附件顯示單車,在地圖組件聲明地圖拖動事件:

<!--index.wxml-->
<view class="container">
  <map id="ofoMap" 
    latitude="{{latitude}}"  // 緯度
    longitude="{{longitude}}"  // 經(jīng)度
    scale="{{scale}}"  // 縮放級別
    controls="{{controls}}" // 地圖控件數(shù)組,多個控件存放在數(shù)組里
    bindcontroltap="bindcontroltap" // 控件點擊事件
    polyline="{{polyline}}"  // 位置連線
    markers="{{markers}}" // 標(biāo)記數(shù)組
    bindmarkertap="bindmarkertap" // 標(biāo)記點擊事件
    bindregionchange="bindregionchange" // 拖動地圖事件
    show-location/>    // 顯示帶有方向的小圓點
</view>

在index.js里實現(xiàn)這個事件方法:

//index.js
var app = getApp()
Page({
 data: {
   scale: 18,
   latitude: 0,
   longitude: 0
 },
// 頁面加載
 onLoad: function(options){
 // 1.獲取定時器,用于判斷是否已經(jīng)在計費
   this.timer = options.timer;

 // 2.調(diào)用wx.getLocation系統(tǒng)API,獲取并設(shè)置當(dāng)前位置經(jīng)緯度
   ...已省略

 // 3.設(shè)置地圖控件的位置及大小,通過設(shè)備寬高定位
   ...已省略

 // 4.請求服務(wù)器,顯示附近的單車,用marker標(biāo)記
   ...已省略
}
// 地圖控件點擊事件
 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
       })
   }
 },
// 地圖標(biāo)記點擊事件,連接用戶位置和點擊的單車位置
 bindmarkertap: function(e){
   ...已省略
 },
// 頁面顯示
 onShow: function(){
   ...已省略
 },
// 定位函數(shù),移動位置到地圖中心
 movetoPosition: function(){
   this.mapCtx.moveToLocation();
 }
})

至此,首頁地圖已經(jīng)完成了,接下來要編寫響應(yīng)的跳轉(zhuǎn)頁面

5.編寫掃碼之后的獲取密碼頁(scanresult文件夾)

上一節(jié)我們?yōu)榱⒓从密図憫?yīng)了掃碼事件,掃碼成功后的頁面是醬的:


 
獲取了密碼的頁面

頁面分析

1.后臺需要拿到開鎖密碼,然后顯示在頁面上

2.我們需要一個定時器,規(guī)定多長時間用來檢查車輛,這期間可以點擊回首頁去車輛報障鏈接,當(dāng)然也就取消了本次掃碼。

3.檢查時長完成后,自動跳轉(zhuǎn)到計費頁面

1.頁面布局

<!--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后開始計費</text>
        <view class="tips-action" bindtap="moveToWarn">
            車輛有問題?
            <text class="tips-href">回首頁去車輛報障</text>
        </view>
    </view>
</view>

2.頁面樣式

.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
}

3.頁面數(shù)據(jù)邏輯

// pages/scanresult/index.js
Page({
  data:{
    time: 9 // 默認(rèn)計時時長,這里設(shè)短一點,用于調(diào)試,ofo app是90s
  },
// 頁面加載
  onLoad:function(options){
    // 獲取解鎖密碼
    this.setData({
      password: options.password
    })
    // 設(shè)置初始計時秒數(shù)
    let time = 9;
    // 開始定時器
    this.timer = setInterval(() => {
      this.setData({
        time: -- time
      });
      // 讀完秒后攜帶單車號碼跳轉(zhuǎn)到計費頁
      if(time = 0){
        clearInterval(this.timer)
        wx.redirectTo({
          url: '../billing/index?number=' + options.number
        })
      }
    },1000)
  },
// 點擊去首頁報障
  moveToWarn: function(){
    // 清除定時器
    clearInterval(this.timer)
    wx.redirectTo({
      url: '../index/index'
    })
  }
})

注意:這里的this.timer不會被傳參到pages/index/index.js里的onload函數(shù)里,被傳參到首頁的定時器是計費頁的定時器,后面會講到

tips: onload函數(shù)參數(shù)說明: options的值是掃碼成功后請求服務(wù)器獲取的單車編號和開鎖密碼

// pages/index/index.js
// 點擊立即用車,判斷當(dāng)前是否正在計費
      case 2: if(this.timer === "" || this.timer === undefined){
          // 沒有在計費就掃碼
          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)在計費就回退到計費頁
        }else{
          wx.navigateBack({
            delta: 1
          })
        }  
        break;
// pages/scanresult/index.js
onload: function(options){
  console.log(options); // { password: "", number: "" }
}

6.編寫計費頁(billing文件夾)

上節(jié)中我們設(shè)置了計時器完成后,跳轉(zhuǎn)到計費頁,它是醬的:


 
計費頁

頁面分析:

1.后臺需要拿到單車編號,并顯示在頁面上

2.我們需要一個計時器累加騎行事件用來計費,而且可以顯示最大單位是小時

3.兩個按鈕:結(jié)束騎行,回到地圖 。其中,點擊結(jié)束騎行,關(guān)閉計時器,根據(jù)累計時長計費;點擊回到地圖,如果計時器已經(jīng)關(guān)閉了,就關(guān)閉計費頁,跳轉(zhuǎn)到地圖。如果計時器仍然在計時,保留當(dāng)前頁面,跳轉(zhuǎn)到地圖。

4.點擊回到地圖會把計時器狀態(tài)帶給首頁,首頁做出判斷,判定再次點擊立即用車響應(yīng)合理邏輯(已經(jīng)在計費,不能重復(fù)掃碼。已經(jīng)停止計費了,需要重新掃碼)

1.頁面結(jié)構(gòu)

<!--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>

2.頁面樣式

.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;
}

3.頁面數(shù)據(jù)邏輯

// pages/billing/index.js
Page({
  data:{
    hours: 0,
    minuters: 0,
    seconds: 0,
    billing: "正在計費"
  },
// 頁面加載
  onLoad:function(options){
    // 獲取車牌號,設(shè)置定時器
    this.setData({
      number: options.number,
      timer: this.timer
    })
    // 初始化計時器
    let s = 0;
    let m = 0;
    let h = 0;
    // 計時開始
    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é)束騎行,清除定時器
  endRide: function(){
    clearInterval(this.timer);
    this.timer = "";
    this.setData({
      billing: "本次騎行耗時",
      disabled: true
    })
  },
// 攜帶定時器狀態(tài)回到地圖
  moveToIndex: function(){
    // 如果定時器為空
    if(this.timer == ""){
      // 關(guān)閉計費頁跳到地圖
      wx.redirectTo({
        url: '../index/index'
      })
    // 保留計費頁跳到地圖
    }else{
      wx.navigateTo({
        url: '../index/index?timer=' + this.timer
      })
    }
  }
})

頁面分析的第4步,主要實現(xiàn)在moveToIndex函數(shù)里。結(jié)束騎行之后,設(shè)置定時器值為空,在點擊回到地圖時判斷計時器的狀態(tài)(值是否為空)。如果為空,關(guān)閉計費頁,結(jié)束本次騎行。如果不為空,攜帶定時器狀態(tài)跳轉(zhuǎn)到首頁,首頁立即用車點擊事件就會對傳過來的參數(shù)(計時器狀態(tài))響應(yīng)合理邏輯。

7.編寫維修報障頁(warn文件夾)

點擊舉報控件,頁面是醬的:


 
維修報障頁1
 
維修報障頁2

頁面分析:

1.頁面可以勾選故障類型,所以需要用到復(fù)選框組件;可以選擇上傳或拍攝圖片,所以要使用wx.chooseImage({})選取圖片API;可以輸入車牌號好備注,所以需要使用input輸入組件。

2.勾選類型,選擇圖片,輸入備注信息完成后,后臺需要獲取這些輸入的數(shù)據(jù)提交到服務(wù)器以獲得反饋。

3.必須勾選類型和選擇周圍環(huán)境圖片才能提交,否則彈窗提示??梢赃x擇多張圖片,也可以取消選擇的圖片。

1.頁面結(jié)構(gòu)

<!--pages/warn/index.wxml-->
<view class="container">
    <view class="choose">
        <view class="title">請選擇故障類型</view> 
        <checkbox-group bindchange="checkboxChange" class="choose-grids">
            <!-- itemsValue是data對象里定義的數(shù)組,item代表數(shù)組的每一項,此處語法為循環(huán)輸出數(shù)組的每一項并渲染到每一個復(fù)選框。下面還有類似語法 -->
            <block wx:for="{{itemsValue}}" wx:key="{{item}}">
                <view class="grid">
                    <checkbox value="{{item.value}}" checked="{{item.checked}}" color="{{item.color}}" />{{item.value}}
                </view>
            </block>
        </checkbox-group>        
    </view>
    <view class="action">
        <view class="title">拍攝單車周圍環(huán)境,便于維修師傅找車</view>
        <view class="action-photo">
        <block wx:for="{{picUrls}}" wx:key="{{item}}" wx:index="{{index}}">
            <image src="{{item}}"><icon type="cancel" data-index="{{index}}" color="red" size="18" class ="del" bindtap="delPic" /></image>
        </block>
            <text class="add" bindtap="bindCamera">{{actionText}}</text>
        </view>
        <view class="action-input">
            <input bindinput="numberChange" name="number" placeholder="車牌號(車牌損壞不用填)" />
            <input bindinput="descChange" name="desc" placeholder="備注" />            
        </view>
        <view class="action-submit">
            <button class="submit-btn" type="default" loading="{{loading}}" bindtap="formSubmit" style="background-color: {{btnBgc}}">提交</button>
        </view>
    </view>
</view>

2.頁面樣式

/* pages/wallet/index.wxss */
.choose{
    background-color: #fff;
}
.choose-grids{
    display: flex;
    flex-wrap: wrap;
    justify-content: space-around;
    padding: 50rpx;
}
.choose-grids .grid{
    width: 45%;
    height: 100rpx;
    margin-top: 36rpx;
    border-radius: 6rpx;
    line-height: 100rpx;
    text-align: center;
    border: 2rpx solid #b9dd08;
}
.choose-grids .grid:first-child,
.choose-grids .grid:nth-of-type(2){
    margin-top: 0;
}
.action .action-photo{
    background-color: #fff;
    padding: 40rpx 0px 40rpx 50rpx;
}
.action .action-photo image{
    position: relative;
    display: inline-block;
    width: 120rpx;
    height: 120rpx;
    overflow: visible;
    margin-left: 25rpx;
}
.action .action-photo image icon.del{
    display: block;
    position: absolute;
    top: -20rpx;
    right: -20rpx;
}
.action .action-photo text.add{
    display: inline-block;
    width: 120rpx;
    height: 120rpx;
    line-height: 120rpx;
    text-align: center;
    font-size: 24rpx;
    color: #ccc;
    border: 2rpx dotted #ccc;
    margin-left: 25rpx;
    vertical-align: top;
}
.action .action-input{
    padding-left: 50rpx;
    margin-top: 30rpx;
    background-color: #fff;
}
.action .action-input input{
    width: 90%;
    padding-top: 40rpx;
    padding-bottom: 40rpx;
}
.action .action-input input:first-child{
    border-bottom: 2rpx solid #ccc;
    padding-bottom: 20rpx;
}
.action .action-input input:last-child{
    padding-top: 20rpx;
}
.action .action-submit{
    padding: 40rpx 40rpx;
    background-color: #f2f2f2;
}

3.頁面數(shù)據(jù)邏輯

// pages/wallet/index.js
Page({
  data:{
    // 故障車周圍環(huán)境圖路徑數(shù)組
    picUrls: [],
    // 故障車編號和備注
    inputValue: {
      num: 0,
      desc: ""
    },
    // 故障類型數(shù)組
    checkboxValue: [],
    // 選取圖片提示
    actionText: "拍照/相冊",
    // 提交按鈕的背景色,未勾選類型時無顏色
    btnBgc: "",
    // 復(fù)選框的value,此處預(yù)定義,然后循環(huán)渲染到頁面
    itemsValue: [
      {
        checked: false,
        value: "私鎖私用",
        color: "#b9dd08"
      },
      {
        checked: false,
        value: "車牌缺損",
        color: "#b9dd08"
      },
      {
        checked: false,
        value: "輪胎壞了",
        color: "#b9dd08"
      },
      {
        checked: false,
        value: "車鎖壞了",
        color: "#b9dd08"
      },
      {
        checked: false,
        value: "違規(guī)亂停",
        color: "#b9dd08"
      },
      {
        checked: false,
        value: "密碼不對",
        color: "#b9dd08"
      },
      {
        checked: false,
        value: "剎車壞了",
        color: "#b9dd08"
      },
      {
        checked: false,
        value: "其他故障",
        color: "#b9dd08"
      }
    ]
  },
// 頁面加載
  onLoad:function(options){
    wx.setNavigationBarTitle({
      title: '報障維修'
    })
  },
// 勾選故障類型,獲取類型值存入checkboxValue
  checkboxChange: function(e){
    let _values = e.detail.value;
    if(_values.length == 0){
      this.setData({
        btnBgc: ""
      })
    }else{
      this.setData({
        checkboxValue: _values,
        btnBgc: "#b9dd08"
      })
    }   
  },
// 輸入單車編號,存入inputValue
  numberChange: function(e){
    this.setData({
      inputValue: {
        num: e.detail.value,
        desc: this.data.inputValue.desc
      }
    })
  },
// 輸入備注,存入inputValue
  descChange: function(e){
    this.setData({
      inputValue: {
        num: this.data.inputValue.num,
        desc: e.detail.value
      }
    })
  },
// 提交到服務(wù)器
  formSubmit: function(e){
    if(this.data.picUrls.length > 0 && this.data.checkboxValue.length> 0){
      wx.request({
        url: 'https://www.easy-mock.com/mock/59098d007a878d73716e966f/ofodata/msg',
        data: {
          // picUrls: this.data.picUrls,
          // inputValue: this.data.inputValue,
          // checkboxValue: this.data.checkboxValue
        },
        method: 'get', // POST
        // header: {}, // 設(shè)置請求的 header
        success: function(res){
          wx.showToast({
            title: res.data.data.msg,
            icon: 'success',
            duration: 2000
          })
        }
      })
    }else{
      wx.showModal({
        title: "請?zhí)顚懛答佇畔?quot;,
        content: '看什么看,趕快填反饋信息,削你啊',
        confirmText: "我我我填",
        cancelText: "勞資不填",
        success: (res) => {
          if(res.confirm){
            // 繼續(xù)填
          }else{
            console.log("back")
            wx.navigateBack({
              delta: 1 // 回退前 delta(默認(rèn)為1) 頁面
            })
          }
        }
      })
    }
    
  },
// 選擇故障車周圍環(huán)境圖 拍照或選擇相冊
  bindCamera: function(){
    wx.chooseImage({
      count: 4, 
      sizeType: ['original', 'compressed'],
      sourceType: ['album', 'camera'], 
      success: (res) => {
        let tfps = res.tempFilePaths;
        let _picUrls = this.data.picUrls;
        for(let item of tfps){
          _picUrls.push(item);
          this.setData({
            picUrls: _picUrls,
            actionText: "+"
          });
        }
      }
    })
  },
// 刪除選擇的故障車周圍環(huán)境圖
  delPic: function(e){
    let index = e.target.dataset.index;
    let _picUrls = this.data.picUrls;
    _picUrls.splice(index,1);
    this.setData({
      picUrls: _picUrls
    })
  }
})

注意: 這里選擇的圖片,路徑為本地路徑,如果要上傳到服務(wù)器,需要調(diào)用API上傳圖片而不是上傳本地路徑。即不能把picUrls數(shù)組上傳到服務(wù)器。

8.編寫登錄/未登錄頁(my文件夾)

點擊頭像控件,未登錄,頁面是醬的

 
未登錄頁

點擊頭像控件,已登錄,頁面是醬的


 
登錄頁

頁面分析

1.個人中心頁有兩種狀態(tài),即未登錄和已登錄,所以要求數(shù)據(jù)驅(qū)動頁面表現(xiàn)形式

2.點擊登錄/退出登錄按鈕需要響應(yīng)合理邏輯,并改變按鈕樣式

3.只有登錄狀態(tài)下才會顯示我的錢包按鈕

1.頁面結(jié)構(gòu)(wx:if 是條件語句)

<!--pages/my/index.wxml-->
<view class="container">
    <view class="user-info">
    <!-- 用戶未登錄就沒有頭像-->
    <block wx:if="{{userInfo.avatarUrl != ''}}">
        <image src="{{userInfo.avatarUrl}}"></image>
    </block>
        <text>{{userInfo.nickName}}</text>
    </view>
    <!-- 用戶未登錄就沒有錢包按鈕-->
    <block wx:if="{{userInfo.avatarUrl != ''}}">
    <view class="my-wallet tapbar" bindtap="movetoWallet">
        <text>我的錢包</text>
        <text>></text>
    </view>
    </block>
    <button bindtap="bindAction" class="btn-login" hover-class="gray" type="{{bType}}" >{{actionText}}</button>
</view>

2.頁面樣式

/* pages/my/index.wxss */
.user-info{
    background-color: #fff;
    padding-top: 60rpx;
}
.user-info image{
    display: block;
    width: 180rpx;
    height: 180rpx;
    border-radius: 50%;
    margin: 0 auto 40rpx;
    box-shadow: 0 0 20rpx rgba(0,0,0,.2)
}
.user-info text{
    display: block;
    text-align: center;
    padding: 30rpx 0;
    margin-bottom: 30rpx;
}
.btn-login{
    position: absolute;
    bottom: 60rpx;
    width: 90%;
    left: 50%;
    margin-left: -45%;
}
.gray{
    background-color: #ccc;
}

3.頁面數(shù)據(jù)邏輯

// pages/my/index.js
Page({
  data:{
    // 用戶信息
    userInfo: {
      avatarUrl: "",
      nickName: "未登錄"
    },
    bType: "primary", // 按鈕類型
    actionText: "登錄", // 按鈕文字提示
    lock: false //登錄按鈕狀態(tài),false表示未登錄
  },
// 頁面加載
  onLoad:function(){
    // 設(shè)置本頁導(dǎo)航標(biāo)題
    wx.setNavigationBarTitle({
      title: '個人中心'
    })
    // 獲取本地數(shù)據(jù)-用戶信息
    wx.getStorage({
      key: 'userInfo',
      // 能獲取到則顯示用戶信息,并保持登錄狀態(tài),不能就什么也不做
      success: (res) => {
        wx.hideLoading();
        this.setData({
          userInfo: {
            avatarUrl: res.data.userInfo.avatarUrl,
            nickName: res.data.userInfo.nickName
          },
          bType: res.data.bType,
          actionText: res.data.actionText,
          lock: true
        })
      }
    });
  },
// 登錄或退出登錄按鈕點擊事件
  bindAction: function(){
    this.data.lock = !this.data.lock
    // 如果沒有登錄,登錄按鈕操作
    if(this.data.lock){
      wx.showLoading({
        title: "正在登錄"
      });
      wx.login({
        success: (res) => {
          wx.hideLoading();
          wx.getUserInfo({
            withCredentials: false,
            success: (res) => {
              this.setData({
                userInfo: {
                  avatarUrl: res.userInfo.avatarUrl,
                  nickName: res.userInfo.nickName
                },
                bType: "warn",
                actionText: "退出登錄"
              });
              // 存儲用戶信息到本地
              wx.setStorage({
                key: 'userInfo',
                data: {
                  userInfo: {
                    avatarUrl: res.userInfo.avatarUrl,
                    nickName: res.userInfo.nickName
                  },
                  bType: "warn",
                  actionText: "退出登錄"
                },
                success: function(res){
                  console.log("存儲成功")
                }
              })
            }     
          })
        }
      })
    // 如果已經(jīng)登錄,退出登錄按鈕操作     
    }else{
      wx.showModal({
        title: "確認(rèn)退出?",
        content: "退出后將不能使用ofo",
        success: (res) => {
          if(res.confirm){
            console.log("確定")
            // 退出登錄則移除本地用戶信息
            wx.removeStorageSync('userInfo')
            this.setData({
              userInfo: {
                avatarUrl: "",
                nickName: "未登錄"
              },
              bType: "primary",
              actionText: "登錄"
            })
          }else {
            console.log("cancel")
            this.setData({
              lock: true
            })
          }
        }
      })
    }   
  },
// 跳轉(zhuǎn)至錢包
  movetoWallet: function(){
    wx.navigateTo({
      url: '../wallet/index'
    })
  }
})

我們將用戶信息使用wx.setStorage({})和wx.getStorage({})這兩個API來設(shè)置和獲取本地存儲,用于模擬維護(hù)用戶登錄狀態(tài)。真實情況下需要使用session

9.編寫我的錢包頁

假設(shè)用戶已登錄,點擊錢包,頁面是醬的:


 
錢包余額頁

頁面分析

1.需要獲取錢包余額數(shù)據(jù)并顯示在頁面上,充值后數(shù)據(jù)會自動更新

2.其他可點擊按鈕分別顯示對應(yīng)的模態(tài)框,因為微信只允許五個頁面層級,避免過多頁面層級造成用戶迷失。

1.頁面結(jié)構(gòu)

<!--pages/wallet/index.wxml-->
<view class="container">
    <view class="overage">
        <view>
            <text class="overage-header">我的余額(元)</text>
        </view>
        <view>
            <text class="overage-amount">{{overage}}</text>
        </view>
        <view>
            <text bindtap="overageDesc" class="overage-desc">余額說明</text>
        </view>       
    </view>
    <button bindtap="movetoCharge" class="btn-charge">充值</button>
    <view bindtap="showTicket" class="my-ticket tapbar">
        <text>我的用車券</text>
        <text><text class="c-g">{{ticket}}張</text>></text>
    </view>
    <view bindtap="showDeposit" class="my-deposit tapbar">
        <text>我的押金</text>
        <text><text class="c-y">99元,押金退款</text>></text>
    </view>
    <view bindtap="showInvcode" class="my-invcode tapbar">
        <text>關(guān)于ofo</text>
        <text>></text>
    </view>
</view>

2.頁面樣式

/* pages/wallet/index.wxss */
.overage{
    background-color: #fff;
    padding: 40rpx 0;
    text-align: center;
}
.overage-header{
    font-size: 24rpx;
}
.overage-amount{
    display: inline-block;
    padding: 20rpx 0;
    font-size: 100rpx;
    font-weight: 700;
}
.overage-desc{
    padding: 10rpx 30rpx;
    font-size: 24rpx;
    border-radius: 40rpx;
    border: 1px solid #666;
}
.my-deposit{
    margin-top: 2rpx;
}
.my-invcode{
    margin-top: 40rpx;
}
.c-y{
    color: #b9dd08;
    padding-top: -5rpx;
    padding-right: 10rpx;
}
.c-g{
    padding-top: -5rpx;
    padding-right: 10rpx;
}

3.頁面數(shù)據(jù)邏輯

// pages/wallet/index.js
Page({
  data:{
    overage: 0,
    ticket: 0
  },
// 頁面加載
  onLoad:function(options){
     wx.setNavigationBarTitle({
       title: '我的錢包'
     })
  },
// 頁面加載完成,更新本地存儲的overage
  onReady:function(){
     wx.getStorage({
      key: 'overage',
      success: (res) => {
        this.setData({
          overage: res.data.overage
        })
      }
    })
  },
// 頁面顯示完成,獲取本地存儲的overage
  onShow:function(){
    wx.getStorage({
      key: 'overage',
      success: (res) => {
        this.setData({
          overage: res.data.overage
        })
      }
    }) 
  },
// 余額說明
  overageDesc: function(){
    wx.showModal({
      title: "",
      content: "充值余額0.00元+活動贈送余額0.00元",
      showCancel: false,
      confirmText: "我知道了",
    })
  },
// 跳轉(zhuǎn)到充值頁面
  movetoCharge: function(){
    // 關(guān)閉當(dāng)前頁面,跳轉(zhuǎn)到指定頁面,返回時將不會回到當(dāng)前頁面
    wx.redirectTo({
      url: '../charge/index'
    })
  },
// 用車券
  showTicket: function(){
    wx.showModal({
      title: "",
      content: "你沒有用車券了",
      showCancel: false,
      confirmText: "好吧",
    })
  },
// 押金退還
  showDeposit: function(){
    wx.showModal({
      title: "",
      content: "押金會立即退回,退款后,您將不能使用ofo共享單車確認(rèn)要進(jìn)行此退款嗎?",
      cancelText: "繼續(xù)使用",
      cancelColor: "#b9dd08",
      confirmText: "押金退款",
      confirmColor: "#ccc",
      success: (res) => {
        if(res.confirm){
          wx.showToast({
            title: "退款成功",
            icon: "success",
            duration: 2000
          })
        }
      }
    })
  },
// 關(guān)于ofo
  showInvcode: function(){
    wx.showModal({
      title: "ofo共享單車",
      content: "微信服務(wù)號:ofobike,網(wǎng)址:m.ofo.so",
      showCancel: false,
      confirmText: "玩的6"
    })
  }
})

我們將金額信息使用wx.setStorage({})和wx.getStorage({})這兩個API來設(shè)置和獲取本地存儲,用于模擬充值邏輯。
設(shè)置本地存儲API官方文檔

10.編寫充值頁面(charge文件夾)

點擊充值按鈕,頁面是醬的


 
充值頁

頁面分析

1.輸入金額,存儲在data對象里,點擊充值后,設(shè)置本地金額數(shù)據(jù)

2.點擊充值按鈕后自動跳轉(zhuǎn)到錢包頁。

1.頁面結(jié)構(gòu)

<!--pages/charge/index.wxml-->
<view class="container">
    <view class="title">請輸入充值金額</view>
    <view class="input-box">
        <input bindinput="bindInput" />
    </view>
    <button bindtap="charge" class="btn-charge">充值</button>
</view>

2.頁面樣式

/* pages/charge/index.wxss */
.input-box{
    background-color: #fff;
    margin: 0 auto;
    padding: 20rpx 0;
    border-radius: 10rpx;
    width: 90%;

}
.input-box input{
    width: 100%;
    height: 100%;
    text-align: center;
}

3.頁面數(shù)據(jù)邏輯

// pages/charge/index.js
Page({
  data:{
    inputValue: 0
  },
// 頁面加載
  onLoad:function(options){
    wx.setNavigationBarTitle({
      title: '充值'
    })
  },
// 存儲輸入的充值金額
  bindInput: function(res){
    this.setData({
      inputValue: res.detail.value
    })  
  },
// 充值
  charge: function(){
    // 必須輸入大于0的數(shù)字
    if(parseInt(this.data.inputValue) <= 0 || isNaN(this.data.inputValue)){
      wx.showModal({
        title: "警告",
        content: "咱是不是還得給你錢?!!",
        showCancel: false,
        confirmText: "不不不不"
      })
    }else{
      wx.redirectTo({
        url: '../wallet/index',
        success: function(res){
          wx.showToast({
            title: "充值成功",
            icon: "success",
            duration: 2000
          })
        }
      })
    }
  },
// 頁面銷毀,更新本地金額,(累加)
  onUnload:function(){
    wx.getStorage({
      key: 'overage',
      success: (res) => {
        wx.setStorage({
          key: 'overage',
          data: {
            overage: parseInt(this.data.inputValue) + parseInt(res.data.overage)
          }
        })
      },
      // 如果沒有本地金額,則設(shè)置本地金額
      fail: (res) => {
        wx.setStorage({
          key: 'overage',
          data: {
            overage: parseInt(this.data.inputValue)
          },
        })
      }
    }) 
  }
})

充值頁面關(guān)閉時更新本地金額數(shù)據(jù),所以需要在unLoad事件里執(zhí)行

擴(kuò)展:使用easy-mock偽造數(shù)據(jù)

小程序多次請求了服務(wù)器“發(fā)送/接受”數(shù)據(jù),其實這里使用了easy-mock這個網(wǎng)站偽造的數(shù)據(jù)。
easy-mock可以作為前端開發(fā)的偽后端,自己構(gòu)造數(shù)據(jù)來測試前端代碼。方便又快捷。官網(wǎng)戳這里。
比如我們這個小程序用到了后端api接口
1.提交報障信息的反饋
2.單車編號和解鎖密碼
3.單車經(jīng)緯度

結(jié)語

到這里,ofo小程序的制作就到了尾聲了。開篇我們創(chuàng)建了多個頁面,然后一個一個頁面從頁面分析,到完成數(shù)據(jù)邏輯,分別響應(yīng)著不同的業(yè)務(wù)邏輯,有的頁面與頁面之間有數(shù)據(jù)往來,我們就通過跳轉(zhuǎn)頁面?zhèn)鲄⒒蛟O(shè)置本地存儲來將它們建立起聯(lián)系,環(huán)環(huán)相扣,構(gòu)建起了整個小程序的基本功能。
通過這個小程序,我們發(fā)現(xiàn)文檔提供的API在不知不覺中已經(jīng)失去了它的神秘感,它們就是不同的工具,為小程序?qū)崿F(xiàn)業(yè)務(wù)請求搭建肢體骨架。
源碼在我的github主頁上,有需要的歡迎fork



作者:這昵稱好帥嘞
鏈接:http://www.jianshu.com/p/3f9b78c68887
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。


易優(yōu)小程序(企業(yè)版)+靈活api+前后代碼開源 碼云倉庫:starfork
本文地址:http://m.chqfk.com/wxmini/doc/course/18130.html 復(fù)制鏈接 如需定制請聯(lián)系易優(yōu)客服咨詢: 點擊咨詢
在線客服
易小優(yōu)
轉(zhuǎn)人工 ×
日韩一区二区视频在线看| 久久精品国产9久久综合| 国产一区二区精品蜜臀av| 国产视频在线精品视频| 久久人人爽人人爽人人亚洲| 欧美一级操逼啊啊啊哦哦哦| 精品一区二区三区大全| 亚洲小说区图片另类春色| 综合久久天天搞天天]| 成人黄色大片免费网站| av 激情 开心 五月| 狠狠操 在线视频 轻轻草| 国产精品久久久久白浆| 日韩av免费福利在线观看| 亚洲另类欧美在线观看| 性感美女一区二区美女| 久久三级片一区二区毛片| 免费成视频人免费91| 天天操天天色天天天| 亚洲人成小说网站色在线| 九月丁香婷婷中文字幕| 国产1区2区在线视频| 91福利精品一区二区| 国产a v一区二区三区香蕉| 久久精品国产亚洲av视瓶 | 福利一区二区在线视频| 99久久精品久久久久久清纯| www国产精品久久久| 日韩欧美亚洲在线第一页| 日韩精选高清大片在线观看| 成人午夜伦理在线观看| 亚洲天堂都市激情av| 亚洲图色熟女五月天| 男人把女人捅爽动漫| 久久草大香蕉在线视频| 亚洲国产精品国自产拍a∨| 亚洲激情视频免费在线| 国产乱人伦av麻豆网| 国产三级av在线免费观看| av 在线 麻豆| 免费高清视频在线观看不卡男男| 欧美成人免费观看黄片| 天天色天天爱天天日| 童话村热久久精品精| 天天操天天射天天综合网| 亚洲日本欧洲一区二区| 日韩欧美在线不卡一区二区三区| 视频你懂得在线观看| 国产精品黄色自拍视频| 丝袜美图一区二区三区| 亚洲另类欧美在线观看| 蜜桃视频18在线观看| av在线操亚洲图片| 91精品午夜呻吟xxxx| 亚洲欧美在线色图动态图| 欧美精品第5页在线观看视频| 国产熟妇一区二区三区av| 两个人午夜免费看视频| 亚洲精品免费一二三区| 手机视频在线观看99精品视频| 99久久精品久久久久久清纯| 久久精品国产二区AV无码| 在线免费看亚洲精品少妇69式| 99精品热视频在线观看| 69精品人妻一区二区| 91麻豆精品国产乱码久久久久久| 99久久免费国产特黄| 日本性少妇xxxx| 四川操bb操bb操b| 在线中文字幕综合一区| 日韩精品高清免费视频| 黄色成人激情福利在线影院| 国产伦精品一区二区黑人| 91久色porny视频在线| 天天爱天天日天天干天天做| 大香蕉97精品一区二区三区| 亚洲精品 国产成人| 天天插天天摸天天爱| 国产老熟女高潮在线播放| 欧美美女视频在线免费看| 最新日韩成人毛片在线| 可以在线观看的黄色网页| 国产欧美精品va在线观看| 农村女人91熟女熟妇| 蜜桃视频18在线观看 | 阿v视频在线观看免费播放| 亚洲天堂都市激情av| 亚洲情品中文字幕人妻久久久边 | 久久视频十八岁亚洲精品久久视频 | 午夜精品久久99蜜桃| 富二代av一区二区| 午夜在线小视频在线观看| 亚洲久久久久久久久久久久久久 | 国产乱子伦一区=区三区| 成人18禁视频网站在线看| 青青操视频在线免费| 免费二区三区四区在线观看| 亚洲天堂欧美中文字幕| 亚洲精品国偷自产久色| 男生的天堂亚洲男人| 老男人久久青草av高清| 大奶子美女免费操逼视频| 亚洲三级伦理在线播放| 操人妻一区二区三区| 蜜桃aⅴ噜噜一区二区三区网址| 亚洲欧美动漫卡通 另类| 亚洲av欧美av在线播放| 天天操天天湿天天干| 亚洲av好看xx站| 日本熟妇丰满厨房55| 北条麻妃制服丝袜在线播放| av网站在线免费浏览| 亚洲人成青青操免费观看| 99久久精品美女高潮喷水| 国产剧情swag在线观看| 国产精品精品3d动漫| av网站资源在线观看| 999久久久无码精品免费看片| 中文字幕久久精品亚洲乱码| 99麻豆精品国产自产在线观看| 91精品午夜呻吟xxxx| 精品人妻一区三区三区| 在线91精品亚洲网站精品成人| 91精品1080部在线播放| 少妇高潮精品一区二区| 51日日夜夜精品视频| 超碰超碰超碰超碰超碰超| 人人妻人人妻人人妻精品| 欧美,日本中文高清视频| 日日夜夜夜操天天干| 香蕉影视在线观看av最新| 国产黄色大片在线免费观看| 午夜精品久久99蜜桃| lisaann在线观看| 伦人伦xxxx国语对白| 国产av一区二区三区天堂| 可以免费看的黄页视频| 久久三级片一区二区毛片| www国产亚洲天堂| 97人妻碰碰碰久久久| 97偷偷碰在线视频| 2020精品国产自在现线官网| 亚洲人人妻一区二区三区| 97色 国产精品综合| 日本老熟妇色狠狠一区| 欧美大黑硬鸡巴操骚肥湿逼| 一区二区三区在线中国| 精品欧美一亚洲精品午夜| 亚洲欧美另类激情综合区动漫| 国产免费一级高清淫日本片| 97超级碰最新在线视频| 国产一区精品在线观看免费| 亚洲中文字幕av在线播放| 91 chinese 在线播放| 国产在线视频国产资源| 黄色免费2b网页18岁有声音| 亚洲国产精品成人久久动漫| 神乃麻美三级在线观看视频| 青青操在线视频精品| 日韩加勒比东京热二区| 精产国品一二三产区999| 国产精品欧美日韩久久久免费观看| 日本福利片免费在线播放| 欧美激情性做爰视频| 天天日……天天操……天天喷| 精品视频在线观看久久| 老鸭窝最新网址在线| 成人激情在线一区二区| 中国福利在线黄色片| 久久久国产视频91| 欧美大黑硬鸡巴操骚肥湿逼 | 在线观看高清日韩av| 国产盗摄女子私密保健视频| 国产欧美精品va在线观看| 日本大鸡巴乱伦肏屄网| 熟女人妻人妻のhd| 久操视频精品在线观看| 日本性少妇xxxx| 色一伊人区二区亚洲最大| r人人妻人人澡人人爽| 国产av人人夜夜澡人人爽下载| 啊啊啊操死我轮操视频免费| 91精品在线播放hd| 国产av大全网站天堂| 熟女免费在线观看视频| 国产黑色丝袜视频在线观看下| 国产精品一品二区三区日韩| 特黄特猛aaaaaaaaa片| 欧美日韩aaaaa级黄片视频| 成人激情在线一区二区| 9797人人妻人人澡| 人妻a∨在线中文字幕| 男人的坤插进女人的屁股里的视频 | 国产剧情星空无限传媒| 成人大片精品在线观看| 国内精品久久久久精品爽爽| 91嫩草精品少妇97九九| 午夜在线看1000集| 成人免费视频国产免费麻豆下| 日韩国产亚洲在线视频 | 美女草草影院在线观看视频| 日本系列变态另类一区二区三区 | 国产三级做爰高清在线| 亚洲性趣老熟妇高清| 免费观看视频一区,二区,三区 | 亚洲天堂网久久av| 天天天天拍天天天天天天| 黑人精品一区a一二区b| 欧美一级黄片视频免费| 欧美黑人天天干夜夜操| 国产av综合av国产精品| 天天色天天爱天天日| 五月天亚洲精品综合网| 中文在线字幕第一页| 精品成人午夜免费看| av中文字幕在线播放| 性感的人妻在线观看| 最新天堂一区二区三区| 人妻少妇精品视频专区vr| 亚洲av性色在线观看黄色| 亚洲主要位于五带中的什么带? | 日本美国亚洲一区二区| 国自产拍偷拍福利精品免费观看| 欧美视频精品免费观看| 欧美成年性精品三级网站| 精品人人妻人人澡人人爽| 人人妻在线视频97| 亚洲精品免费一二三区| 亚洲精品国偷自产久色| 亚洲天堂欧美中文字幕| 青青操国产精品视频在线| 亚洲人成亚洲人成在线观看com | 国内精品视频久久久久| 日韩欧美在线一区二区在线| av手机在线免费播放| 天天日天天日天天日天天干| 天天扣天天日天天摸| 欧美精品第5页在线观看视频| 先锋资源在线观看国产精品| 人妻熟妇丰满不伦一区二区三区| 中文字幕第一区久久| suv精品一区二区6| 日韩破处精品在线观看| 日本性感黑丝美女一区二区| 蜜桃成人av电影网站| 不卡精品国产_亚洲人成在线| 国产专区视频在线观看免费| 人操美女操美女操美女| 国产一区二区精品蜜臀av| 99,九九,久久精品| 亚洲国内自拍愉拍影音先锋| 最新亚洲成人黄色片| 污污污视频在线观看91| 童话村热久久精品精| 日韩精选高清大片在线观看 | 日韩三级中文字幕熟女| 亚洲,自拍,中文,另类| 播放灌醉水嫩大学生国内精品 | 日本伦理在线免费视频| 在线看片1024你懂得| 好的一级毛片免费毛片直播| 大秀视频一区二区三区| 欧美黑人抱着强干视频| 久久人人爽人人爽人人亚洲| 91在线视频只有精品| 无套内谢少妇高潮毛片免费看| 99国产精品免费视频观看a| 色综合久久加勒比高清剧情| 播放灌醉水嫩大学生国内精品| 亚洲午夜免费精品久久久| 亚洲天堂男人的天堂av| 久草免费资源视频在线观看| 欧美 日韩 中文 字幕| 搡四十路e五十路熟女av| 白峰美羽在线观看av| 久久精品国产亚洲AV牛牛影视| 国产乱人伦av麻豆网| 日韩精选高清大片在线观看| 成年人中文字幕视频网| 国产精品欧美日韩久久久免费观看 | av在线操亚洲图片| 国产又粗又猛又爽又色视频| 欧美精品第5页在线观看视频| 办公室被吃奶好爽在线观看视频| 国产情侣激情在线对白| 啪啪在线视频免费观看| 少妇人妻不满足中文字幕| 五月天开心激情深爱激情| 另类图片亚洲图区第一页| 亚洲熟妇色在线观看| 欧美激情自拍2020| 自拍分享国产亚洲欧美| 在线视频一视频二视频三| 神乃麻美三级在线观看视频| 欧美中文字幕综合在线| 免费二区三区四区在线观看| 4455vw在线观看| 超碰人妻中文字幕在线| 日韩伦理一区二区三区有码| 蜜桃视频18在线观看| 东游记中文字幕版哪里可以看到| 国产一线女人天堂av| 97精品国产高清在线| 亚洲欧美区二区三区| 67194久久一区二区| 天天日天天看天天摸| 色婷婷亚洲久久97成人| 宝贝把腿张开让我添| 日韩毛片综合在线观看网站| 大秀视频一区二区三区| 国产av一区二区三区天堂| av色哟哟国产精品| 干风骚美女av在线| 人妻中文字幕在线视频免费观看| 午夜啪啪啪免费视频网站| 国产在线观看网站资源| 爱人体-看人体人体摄影| 国产一级免费黄色录像片| 粉嫩av入口一区二区三区| 熟女免费在线观看视频 | 隔壁放荡人妻bd完整版| 99国国视频在线播放| 国产成人午夜精品视频| 亚洲人成亚洲人成在线观看com| 久久少妇精品一区二区免费| av国产在线观看网站| 日本性少妇xxxx| 国产熟女一区二区三区四| 两个人午夜免费看视频| 日韩欧美亚洲在线第一页| 国产成人啪精品视频免费| 麻豆一区二区大豆行情| 91麻豆精品一二三区在线成人| 99热这里只有的精品666| 欧美精品日韩第一页| 最新人妻熟女中文字幕 | 看男破处女人逼黄色片观看| 久久视频十八岁亚洲精品久久视频| 免费无码专区毛片高潮喷水| 成人午夜影视在线观看| 人妻中文字幕不卡av观看| 国产av在线一区二区| 欧美av色香蕉一区二区小说| 99久在线精品99re8热视频| 女人被男人阳具抽插的呻吟视频 | 亚洲国产日韩欧美高清片vr| 好男人资源在线视频观看社区| 欧美亚洲综合偷拍另类| 亚洲 网友 在线 观看| 亚洲一级免费av黄色打炮片| av男人免费的天堂| 亚洲国产成人在线观看网址| 欧洲日韩视频一区二区三区| 日本黄色操碌缬巴| 国产成人午夜精品视频| 91人妻人澡人人爽人人精品| 国产精品久久久久白浆| 欧美成年性精品三级网站| 未满18禁止入内免费视频| 熟女免费在线观看视频| 91人妻人澡人人爽人人精品| 在线观看国产影片| 五月天丁香婷久久爱| 久久少妇精品一区二区免费| 骚白虎插入在线观看| 中文字幕国产电影在线观看| 国产a v一区二区三区香蕉| 丝袜av在线丝袜av天堂国产| 国产日视频在线观看| 日本少妇人妻久久中文| 狠狠干狠狠操五月天| 好男人资源在线视频观看社区| 国产精品爽黄69天堂ai蜜乳| 1717精品视频在线观看| 一区二区中文字幕18| 欧美精品日韩第一页| 操日本裸体美女骚逼| 国产亚洲精品电影aa在线观看| 亚洲久久久久久久久久久久久久| 欧美一区二区蜜桃视频| 丁香激情五月天综合网| 无套内谢少妇高潮毛片免费看 | 亚洲人体艺术二区三区视频| 视频在线播放一区二区| 超碰在线97人人草| 免费熟女精品一区二区三区| 操人妻视频在线免费观看| 欧美激情在线观看一区| 日日天天干夜夜夜操狠狠干| 精品岛国产熟女人妻欲求不满| 国产老熟女高潮在线播放| 天天透天天插天天通| 91精品人妻一区二区三区水蜜桃 | 182tv在线福利视频| 日本vvvv操操操| 三级三级三级日本99| 国产日视频在线观看| 黄色av免费下载软件| 丰满雪白人妻人爽16av精品| 隔壁老王国产在线观看| 77777蜜臀精品久久综合| 青青青青青青青青草青青| 午夜精品福利一区二区三区p | 69精品人妻一区二区| 婷婷综合尤物精品国产| 五月天丁香婷久久爱| 女人扒开逼逼让男人操| 美女吃鸡巴黑料破处自慰| 69精品人妻一区二区| 啪啪在线视频免费观看| 国产av综合av国产精品| 免费观看视频一区二区三区| 午夜网在线观看视频| 大鸡巴操的好爽好舒服啊视频| 亚洲国内自拍愉拍影音先锋| 人妻久久免费视频中文字幕| 超碰chaopeng 国产| 在线播放 国产 真实| 91老熟女连续高潮对白| 亚洲人成小说网站色在线| 亚洲国产精品成人久久动漫| 欧美成人a v在线| 99热6在线播放免费| 精品久久久久aⅴ一区二区| 在线视频无码理论片| 性色av成年在线观看| 999热这里只有精品视频| 涩涩漫画网站在线观看| av乱亚洲一区二区三区| 亚洲欧美在线色图动态图| 亚洲综合欧美熟一区| 青青青青青青青青青青青青青草| 国产精品欧美日韩久久久免费观看| 婷婷av一区二区三区7| 99精品国产免费久久久久久| av网址在线观看日韩| 久久久老熟女一区二区| 久久久999精品在线| 伊人青操在线观看视频网站| 污污污视频在线观看91| 在线观看国产影片| 中文字幕久久久久久人妻| 天天干夜夜操日日操| av在线播放网站资源| 日日躁夜夜躁狠狠久久av| 黄色av免费下载软件| 伊人青青青在线观看| 欧洲av,亚洲av| 国产又黄又粗又硬又大又猛的视频 | 国产美女视频在线播放| 一区二区三区欧美高清| 欧美成年性精品三级网站| 日日夜夜狠狠干干亚洲| 可以免费看啪啪啪的网站| 99热这里只有的精品666 | 污污污视频在线观看91| 涩涩漫画网站在线观看| 国产黑色丝袜视频在线观看下| 亚洲国产精彩中文乱码av| 不卡一区二区啪啪视频| 成人麻豆免费视频精品区| 88888欧美精品久久久| 操人妻视频在线免费观看| 久re这里只有精品视频| 日韩国产亚洲在线视频| 欧美成年性精品三级网站| 99精品视频在线观看专区| 日本五十路六十路中出| 啪啪啪免费亚洲精品网站| 综合另类小说欧美另类图片| 人妻中文字幕在线视频免费观看| 偷拍自拍 中文字幕| 不卡一区二区啪啪视频| 91精品久久久久久婷婷高清| 亚洲欧洲自拍他拍av| 97国产在线精品观看| 爆操性感美女性色av| 国产情侣激情在线对白| 亚洲va欧美va人人爽午夜| 无人码一区二区三区视频| 手机在线免费视频一区二区三区| 在线免费看亚洲精品少妇69式| 国产精品自拍亚洲春色| 欧美 激情 另类 自拍| 免费观看视频一区,二区,三区| 日韩av中文字幕网址| 欧美亚洲三级色图网站| 亚洲人人妻一区二区三区| 欧美亚洲三级色图网站| 国语对白xxxx乱大交| 欧美一级性生活片人与动物| 91在线视频只有精品| 欧洲日本亚洲一区二区| 久久99精品国产99久久6尤| 9l九色自拍蝌蚪9l视频| 久久久久久久久久久蜜桃| 人妻a∨在线中文字幕| 1777中文字幕字幕在线播放| 国产精品自拍亚洲春色| 亚洲欧洲美洲无码在线| 91久久精一区二区三区大全| 欧美黑人天天干夜夜操| 亚洲精品少妇久久久久久| 操日本裸体美女骚逼| 人妻 日韩精品免费| 在线高清视频你懂得| 国产乱子伦一区=区三区| 中文字幕av网址大全| 另类图片亚洲图区第一页| 综合久久天天搞天天]| 69 久久99精品久久久| 欧美图色 亚洲图色| 亚洲日本一区二区嫩草| 亚洲天堂av插插插| youtube视频字幕中文| 亚洲精品少妇蜜桃久久久| 国产成人啪精品视频免费| 亚洲 欧洲 国产 麻豆| 国产一区二区精品蜜臀av| 欧美精品黑人粗大破除| 国产成人女人毛毛片视频| 69 久久99精品久久久| 亚洲中文有码一区二区| 91免费观看国产精品| 男人把女人捅爽动漫| 偷窥中国丰满多毛老熟女| 91麻豆精品国产乱码久久久久久| 中文字幕av网址大全| 人妻夜夜爽av性色大片| 国产精品啪啪啪免费网站| 亚洲精品乱码久久观看网| 成人麻豆免费视频精品区| 狂野小农民在线高清| 国产又黄又粗又硬又大又猛的视频| 99精品视频在线观看专区| 亚洲精品少妇久久久久久| 国产精品自拍亚洲春色| 操人妻视频在线免费观看| 青青热久免费精品视频21| 午夜福利免费福利视频| 2022AV天堂免费在线观看| 人妻天天爽夜夜爽麻豆av| 中文字幕最新色片av| 亚洲精品**不卡在线播he| 日本免费啪啪啪啪啪啪啪啪啪啪| 亚洲自拍偷拍视频二区| 69精品人妻一区二区| 精品国产污污免费网站aⅴ17| 91亚洲情色在线播放| 又黑又硬又粗又黄又猛| 勾引小哥鸡巴操逼视频下载| 古典武侠校园春色亚洲| 视频你懂得在线观看| 日本av毛片在线播放| 偷窥老熟女久久久av| heyzo久久综合色88| 欧美亚洲天堂不卡视频| 成人3d动漫一区二区三区91| 伦人伦xxxx国语对白| 亚洲国产日韩欧美高清片vr| 美女诱惑福利在线视频| 亚洲,自拍,中文,另类| 大肉大捧一进一出免费视频网址 | 日本少妇精品bbwbbw| 五月天丁香婷久久爱| 人妻天天爽夜夜爽麻豆av| 亚洲高清中文字幕在线的| 搡四十路e五十路熟女av| 一区二区三区亚洲蜜桃| 国产三级伦理在线观看| 亚洲精品1234区在线看| 久久久999精品在线| 人人妻在线视频97| 国产欧美日韩一区91| 日本公与妇电影三级| 深夜亚洲精品免费福利你懂的| 要看tv在线观看欧美日韩| 亚洲性趣老熟妇高清| 新婚人妻聚会被中出| 国产av一区二区三区天堂| 粉嫩av入口一区二区三区| 精品少妇人妻av免费久久胖妇| 国产精品视频白浆免费网站| 日本av高清免费观看| 国产精品爽黄69天堂ai蜜乳| 天天操天天射天天综合网| 免费人妻av一区二区| 在线视频无码理论片| 日本大鸡巴乱伦肏屄网| 老鸭窝在线观看免费观看高清版| 男女精品久久久久久久久久| 日韩资源在线中文字幕| 久草视频免费在线视频观看| 亚洲精品成人原创视频| 亚洲av日韩一区二区三区四区| 免费成视频人免费91| 亚洲欧美 在线视频| 在线观看高清日韩av| 欧美亚洲天堂不卡视频| 四川操bb操bb操b| 欧美综合自拍亚洲综合图区逼欠插| 亚洲欧美在线x视频| 精产国品一二三产区999| 午夜福利精品视频在线观看| 亚洲自偷自拍另类性受不了| 女人扒开逼逼让男人操| 婷婷综合尤物精品国产| 国产1区2区在线视频| 狠狠操操操操操操操操操操| 一区二区人妻丝袜粉嫩| 欧美在线播放一二区不卡| 91九色porny国产探花| 久久草大香蕉在线视频| 亚洲免费观看高清在线| 日韩高清av一区二区三区| 十八禁视频一区二区三区四区| 精品熟女后入一区二区三区| 91精品在线播放hd| 欧美综合一区二区三区| 伦人伦xxxx国语对白| 五月婷婷丁香花激情网| 黄色成人激情福利在线影院| 97超碰在线cao| 男人天堂地址在线播放| 亚洲三级伦理在线播放| 女人样男人用大鸡巴操她的逼逼| 男生用大鸡巴捅女生的视频| 国产在线免播放器不卡| 蜜桃精品在线观看一区| 天天天天拍天天天天天天| 勾引小哥鸡巴操逼视频下载| 精品一区二区三区四区激情| 亚洲中文字幕有码电影| 国产欧美日韩一区91| 天天操夜夜爽夜夜操| 欧美中文字幕综合在线| 亚洲男人天堂111117av| 91久久综合九色综合欧美98| 人人妻人人澡人人爽电台app| 91福利国产成人精品| 程嘉美日本全部三级| 亚洲视频综合在线播放| caoporn香蕉在线观看| 日本a爱视频二区三区| 欧美激情在线观看一区| 亚洲综合另类小说色区色噜噜,| 久久草大香蕉在线视频| 日本系列变态另类一区二区三区| 登录国产黄色一区二区三区| 综合久久天天搞天天]| 日本日本熟妇中文在线视频| 顶级销魂极品少妇在线观看| 国内精品久久久久精品爽爽 | 欧美亚洲校园春色另类| 天天摸天天干天天插天天操| 两个人午夜免费看视频| 欧美精品乱码久久久久久| 97偷偷碰在线视频| 91在线视频只有精品| 免费人妻av一区二区| 亚洲一区二区成人综合| 欧美一级性生活片人与动物| 日本老太婆老熟妇av| 欧美视频精品免费观看| 掀开奶罩边吃边摸下娇喘视频 | 国产黄a三级三级三级三级三级| 久久躁夜夜躁日日躁狠狠躁| 9色自拍视频在线观看| 老司机免费福利视频网| 4455vw在线观看| 日韩国产亚洲在线视频| 偷拍自拍视频图片免费| 在线免费看亚洲精品少妇69式| 亚洲高清中文字幕在线的| 久久亚洲伊人99精品影院| 亚洲天堂 校园春色| mm在线视频观看免费观看| julia 人妻中文字幕| 日韩美女精品一在线观看| 日韩精选高清大片在线观看| 欧美一区二区三区乱轮| 超碰在线观看97视频| 99久久精品美女高潮喷水| 97偷偷碰在线视频| 久久精品亚洲国产| 天堂av在线中文在线新版| 亚洲精品**不卡在线播he| 人操美女操美女操美女| 特黄特色大片观看免费| 亚州 欧美日韩人妻熟女| 欧美综合自拍亚洲综合图区逼欠插| 日韩无码成人电影一区二区| 国产精品亚洲综合视频| 欧美va久久久噜噜噜久久| 亚洲中文有码一区二区| 精品人妻一区三区三区| 天天操天天摸天天摸| 亚洲女同性同志熟女女同| 亚洲国产欧美日韩国产| 丝袜制服 亚洲 国产 91| 少妇的激情夜夜爽爽爽爽爽| suv精品一区二区6| 久久久亚洲精品熟妇少妇| 奇米一区二区三区视频在线观看| 午夜啪啪啪免费视频网站| 亚洲自拍偷拍清纯唯美| 隔壁老王国产在线观看| 中国熟妇丰满大乳大屁股| 欧美福利视频一二三| 精品一区二区三区在线免费播放| 亚洲天堂网久久av| 亚洲欧美综合区丁香六月| 久久久久久久久毛片精品奶炮 | 女人被男人阳具抽插的呻吟视频| 中国熟妇丰满大乳大屁股 | 亚洲无码成人福利视频| 91九色porny国产探花| 女人张开双腿让男人捅视频| 成人av影视一区在线观看 | 老鸭窝最新网址在线| 96h久久国产激情| 在线视频无码理论片| 午夜剧场欧美一区二区| 婷婷爱在线视频精品| 玩弄放荡人妻少妇精品| 一区二区三区四区免费福利视频| 狠狠干狠狠操五月天| 99久久精品美女高潮喷水| av在线操亚洲图片| 美女诱惑福利在线视频| 男人把女人捅爽动漫| 99久久精品久久久久久清纯| 一区二区中文字幕18| 一区二区三区四区不卡在线观看| 免费直接观看的麻豆黄色| 蜜桃视频18在线观看| 日本av高清免费观看| 久久久亚洲精品熟妇少妇| 亚洲在线一区二区三区免费| 国产美女视频在线播放| 男的扒开女的下面狂操视频| 91精品在线播放hd| 精品一区二区三区在线免费播放| 夜夜骑加勒比天天操| 国产av一区二区三区天堂| 免费熟女精品一区二区三区| 污污污视频在线观看91| 人妻中文字幕在线视频免费观看| 黄色成人激情福利在线影院| 鸡巴操进我的小穴欧美国产 | 视频在线观看免费99| 在线视频你懂的视频| 97精品国产高清在线| 老师让我插进去69AV| 99热这里只有的精品666| 丝袜美腿视频诱惑亚洲| 久久精品亚洲国产| 亚洲免费观看小视频| 91在线免费观看成人| 国产av综合av国产精品| 99热6在线播放免费| 福利一区二区在线视频| 正宗欧美在线观看一区二区| 99麻豆精品国产自产在线观看| av手机在线免费播放| 在线看片1024你懂得| 2018免费天天干夜夜操| 亚洲欧美伦理一区二区| 筱田优在线播放一区二区三区| 在线观看懂色精品大神视频 | 久久久亚洲精品熟妇少妇| 污污污视频在线观看91| 国产情侣激情在线对白| 在线视频一视频二视频三| 五月天免费在线观看| 精品岛国产熟女人妻欲求不满| 亚洲国产精品国自产拍a∨| 国产精品一品二区三区日韩| 日本老太婆老熟妇av| 天天日天天看天天摸| 日韩一区二区视频在线看| 天天日天天日天天日天天干| 国产绿帽人妻精品系列| av色哟哟国产精品| 国产传媒中文字幕在线| 天天干天天操天天日天天射| 91精品久久久久久婷婷高清| 搡四十路e五十路熟女av| 97国产婷婷在线观看| 我用力操你在线视频| 亚洲天堂网久久av| 一区二区三区欧美日韩电影| 中国熟妇丰满大乳大屁股| 特黄特猛aaaaaaaaa片| 天天日天天色天天搞| 日韩毛片基地免费看| 美女av网站在线观看| 免费观看日本黄页网站| 国产成人一区二区三区久| 日本电影高清一区二区| 96h久久国产激情| 精产国品一二三产区999| 亚洲国产aⅴ成人精品无吗| 日日躁夜夜躁狠狠久久av| 瑟瑟的网站在线观看| 91久久国产丁香精品中文| 91久久综合九色综合欧美98| 十八禁视频一区二区三区四区| 国语对白xxxx乱大交| 日韩精选高清大片在线观看 | julia 人妻中文字幕| www国产亚洲天堂| 涩涩网站在线观看视频| 日韩av免费福利在线观看| 少妇的激情夜夜爽爽爽爽爽| 国产国语露脸在线视频播放| 国产女人露脸高潮对白视频| yy111111少妇蜜桃| yy111111少妇蜜桃| 国产专区视频在线观看免费 | 免费成人中文字幕电影| 国产1区2区在线视频| 欧美精品日韩第一页| 欧美美女视频在线免费看| 五月天开心激情深爱激情| x8x8免费在线观看视频| 欧美综合一二区在线| 日本老熟妇色狠狠一区| 精品久久久久aⅴ一区二区| 欧美午夜不卡一区二区三区| 成年大片40分钟免费视频播放| 亚洲另类熟女国产精品老| x8x8免费在线观看视频| 小少妇被大鸡巴操手机在播放| 丰满雪白人妻人爽16av精品| 国产mm视频在线观看| 国产精品亚洲综合视频| 日本大鸡巴乱伦肏屄网 | 中文字幕日本一本二本三区| 91人妻人人做人人爽九色全集 | 狠狠操操操操操操操操操操| 日韩欧美亚洲一区第一| 免费在线观看网址你懂的| 日本大鸡巴乱伦肏屄网| 国产精品久久久久精品蜜月| 亚洲小说区图片另类春色 | 日本公与妇电影三级| 免费观看视频一区二区三区| 中文字幕一区三区二区国产黄色| 日本黄页网络站免费| 日日夜夜夜操天天干| 超级碰碰碰97免费视频97| 久久久国产视频91| 偷窥老熟女久久久av| 五月婷婷丁香花激情网| 在线91精品亚洲网站精品成人| 亚洲国产成人在线观看网址| 久精彩视频免费观看| 涩涩漫画网站在线观看| 亚洲一区二区三区免费| julia 人妻中文字幕| 日韩av卡一卡二卡三| x8x8免费在线观看视频| 顶级销魂极品少妇在线观看| av网站资源在线观看| 黄色中文字幕在线观看| 在线手机免费观看视频| 操人妻一区二区三区| 亚洲国产精品国自产拍av在线| av色哟哟国产精品| 超碰在线97人人草| 国产欧美日韩经典一区| 成人黄色大全在线观看| 亚洲国产精彩中文乱码av| 婷婷av一区二区三区7| 丰满的女教师bd视频| 视频你懂得在线观看| 超级碰碰碰97免费视频97| 久久精品在线观看免费视频| 欧美综合一二区在线| 日韩精品高清免费视频| 亚洲免费观看高清在线| 国产伊人 av 自拍| 97超碰在线cao| 超碰chaopeng 国产| 国产剧情免费在线观看| julia 人妻中文字幕| 极品国模sm镣铐调教| 天天大香蕉一区二区三区| 干风骚美女av在线| 天天日天天色天天摸| 91大神视频在线观看视频| 黄色中文字幕在线观看| 五月天中文字幕剧情在线| 色婷婷久久久久av| 国产剧情swag在线观看| 99久久精品美女高潮喷水| 欧美激情性做爰视频| 精品一区二区三区大全| 成人大片精品在线观看| 黑人精品一区a一二区b| 亚洲美女乱1区2区3区| 成人3d动漫一区二区三区91| 一区二区人妻丝袜粉嫩| 黄色性网站免费观看| 亚洲精品专区一区二区| 国产av大全网站天堂| 欧美 日韩 中文 字幕| 五月天开心激情深爱激情| 欧美在线播放一二区不卡| 日本a爱视频二区三区| 日韩破处精品在线观看| 一区二区三区国产精选在线播放| 日本女护士久久精品| 亚洲精品少妇蜜桃久久久| 91精品午夜呻吟xxxx| 91精品国产国语自拈产在| 亚洲情品中文字幕人妻久久久边| 一区二区三区国产精选在线播放| 99久久999久久久hd| 亚洲免费观看高清在线| 漂亮的人妻不敢呻吟被中出| 午夜在线看1000集| 亚洲熟妇av一区二区蜜桃第1集| 一级女人色又黄毛片女人| 丰满人妻被猛烈进入中文字幕四川| 99久久夜色精品国产亚洲软件 | 日韩加勒比东京热二区| 超碰chaopeng 国产| 久草视频免费在线视频观看| 激情 亚洲 精品视频| 亚洲中文字幕在线观看黑人| 国产av在线一区二区| 国产亚洲精品天堂在线观看| 亚洲图片,自拍偷拍网| 富二代av一区二区| 日本熟妇wxw日本人妻| 日韩高清av一区二区三区| 大肉大捧一进一出免费视频网址| 欧美一区,二区三区高清视频| 深夜亚洲精品免费福利你懂的| 在线观看小视频国产| 欧洲野外激情性视频| 国产一级二级三级亚洲| 五月婷婷综合久久久| 久精彩视频免费观看| 变态另类97人妻av| 亚洲免费观看高清在线| 天天插天天爱天天日| 中文字幕国产电影在线观看| 欧美福利专区一区二区三区| 天天大香蕉一区二区三区| 男人插女人逼app| 亚洲av永久久久久久久蜜桃| 99国国视频在线播放| 日韩成人在线电影,| 久久草大香蕉在线视频| 亚洲精久久久久久久久久久久久| 亚洲国产中文字幕在线视频| 999在线视频一区二区三区| 91九色在线视频网站| 午夜精品福利一区二区三区p| 国产又粗又猛又爽又色视频| 亚洲福利导航在线视频| 国产麻豆在线av| 日韩成人综艺在线播放| 熟女人妻av中文字幕| 办公室被吃奶好爽在线观看视频 | 色婷婷亚洲久久97成人| 亚洲国产精品日日夜夜| 92免费视频人妻网| 超碰在线观看97视频| 好的一级毛片免费毛片直播| 熟女一区二区三区四区五区视频| 999热这里只有精品视频| 久久一区二区三区杨幂| 日韩av在线区二区| 操日本裸体美女骚逼| 成人一级黄色片免费看 | 久草视频免费在线视频观看| 色男人的天堂一区二区三区| 欧美 亚洲 激情 自拍| 日韩国产精品高清中文在线| 欧美大长腿美女抽插网站| 中文字幕av网址大全| 骚白虎插入在线观看| 在线观看免费黄片欧美| 亚洲免费国产在线日韩| 久久一区二区三区杨幂| 亚洲五区四区欧美视频| av蜜桃网在线观看| 天天插天天爱天天日| 欧美日韩国产在线观看了| 免费成人中文字幕电影| 销魂少妇一区二区视频| 精品成人午夜免费看| 在线观看av久久久| 亚洲欧美日韩偷窥自拍| 销魂少妇一区二区视频| 国产一区精品在线观看免费| 91大神视频在线观看视频| 国内精品视频久久久久| www国产亚洲天堂| 天天插天天摸天天爱| 搡四十路e五十路熟女av| 欧美图色 亚洲图色| 日本电影高清一区二区| 四川熟女a一区二区三区| 国内人人人妻狠狠狠操操| 手机在线免费视频一区二区三区| 青青草成人免费电影| 亚洲国产欧美日韩国产| 日韩欧美亚洲在线第一页| 浪荡人妻共32部分黑人| 熟女人妻av中文字幕| 欧美激情性做爰视频| 熟女一区二区三区四区五区视频 | 大鸡巴爆操美女骚逼| 亚洲中文字幕在线观看黑人| 日韩国产精品高清中文在线| 欧美1234不卡视频| 一区二区三区在线中国| 国产精品久久久久白浆 | 欧美精品日韩第一页| 国产专区视频在线观看免费| 大吊插入素人骚穴内射视频播放| av手机在线免费播放| 在线观看成人激情av| 日本性感黑丝美女一区二区| 国产女人露脸高潮对白视频| 日本视频免费大片| 成人在线视频国产自拍| 欧美激情性做爰视频| 亚洲一区二区三区免费| 在线手机免费观看视频| 91人妻人人做人人爽九色全集| 在线观看免费a亚洲| 在线小视频,你懂的| 手机能看的黄色av| 日本日本熟妇中文在线视频| 亚洲三级这里只有精品| 色片免费在线观看喷水| 亚洲欧美 在线视频| 国产伊人 av 自拍| 日本免费啪啪啪啪啪啪啪啪啪啪| 亚洲妇熟xxxx妇色黄网站| 亚洲欧美另类图片88| 一级白丝美女久久久久| 97免费人妻超碰97在线| 国产精品亚洲综合视频| 粉嫩av入口一区二区三区| 国产午夜在线免费视频| 亚洲在线一区二区三区免费| 起碰97视频在线播放| 久久精品国产亚洲a| 午夜三级影片免费播放| 干风骚美女av在线| heyzo久久综合色88| 中文在线字幕第一页| 四川操bb操bb操b| av精选一区二区久久| 日韩成人在线电影,| 美女极品美女福利视频在线| 三级黄色亚洲成人av| 涩涩网站在线观看视频| 手机视频在线观看99精品视频 | 久久久亚洲精品熟妇少妇| 亚洲av男人的天堂久久久| 老师让我插进去69AV| 粉嫩av入口一区二区三区| 五月天开心激情深爱激情| 午夜性色福利视频自拍偷拍| 小少妇被大鸡巴操手机在播放| 51日日夜夜精品视频| 亚洲国产精品日日夜夜| 搡四十路e五十路熟女av| 日本vvvv操操操| 91精品人妻中文字幕| 欧美亚洲天堂不卡视频| 国产无遮挡精品视频观看| 隔壁放荡人妻bd完整版| 91精品人妻一区二区三区水蜜桃| 91久色porny视频在线| 亚洲欧美在线色图动态图| 骚白虎插入在线观看| 黑人熟女一区二区三区| 91国内精品视频在线| 91表用白丝脚帮我脚交| 青青草青青草成人免费公开| 日本性少妇xxxx| 在线视频无码理论片| 五月天亚洲精品综合网 | 青娱乐青青草丁香婷婷| 国产成人午夜精品视频| 不卡黄色免费在线观看| 亚洲熟妇av一区二区蜜桃第1集| 少妇美女大极品内射| 6080日韩伦理片| 成人大片精品在线观看| 成人麻豆免费视频精品区 | 91免费观看国产精品| 亚洲av性色在线观看黄色| 东方av在线免费进入| 老男人久久青草av高清| 免费观看视频一区二区三区| 午夜国产福利视频一区二区| 两个人午夜免费看视频| 少妇人妻不满足中文字幕| 亚洲精品成人原创视频| 欧美亚洲校园春色另类| 亚洲 欧洲 国产 麻豆| 亚洲自拍偷拍视频二区| 欧美一区二区三区乱轮| 欧美成年性精品三级网站| 可以在线观看的黄色网页| 爱人体-看人体人体摄影| 久草免费资源视频在线观看| 青青热久免费精品视频21| 色婷婷久久久久av| 隔壁老王国产在线观看| 婷婷av一区二区三区7| 亚洲av好看xx站| 久久久久久久久毛片精品奶炮 | 国产黑色丝袜视频在线观看下| 99久久精品久久久久久清纯| 人人妻人人妻人人妻人人妻人人人| 午夜偷拍福利小视频| 色就色欧美亚洲αv| 丁香激情五月天综合网| 日本少妇人妻久久中文| 亚洲精品 国产成人| 亚洲成人一区二区三区av| 国产一区三区四区五区| 欧美黑人天天干夜夜操| 在线观看小视频国产| 天天日天天日天天日天天干| 黑人熟女一区二区三区| 在线高清视频你懂得| 国产盗摄女子私密保健视频| 欧美精品综合第一页| 中文字幕av一区二区三区高| 亚洲成年人三级电影| 东游记中文字幕版哪里可以看到| 寂寞少妇一区二区三区| 黄色av免费下载软件| 两个人午夜免费看视频| 在线视频你懂的视频| 免费在线观看网址你懂的| 91精品人妻中文字幕| 精品国产污污免费网站aⅴ17| 粉嫩av入口一区二区三区| 无套内谢少妇高潮毛片免费看| 国产粉嫩粉嫩的在线18观看| 亚洲熟妇色在线观看| 自拍第一页免费视频| 精品人人妻人人澡人人爽| 大肉大捧一进一出免费视频网址 | 亚洲综合精品推荐69堂| 国产伦精品三区精品国偷自产在线| 东游记中文字幕版哪里可以看到 | 免费熟女精品一区二区三区| 久久久老熟女一区二区| 国产又粗又长又硬又猛又黄的视频| 日本老太婆老熟妇av| 亚洲久久久久久久久久久久久久| 日本大鸡巴乱伦肏屄网| 十八禁视频一区二区三区四区| 青青草成人免费电影| 五月天开心激情深爱激情| 性感美女一区二区美女| 亚洲女同性同志熟女女同| 成人午夜伦理在线观看| 视频在线观看免费99| 亚洲图片,自拍偷拍网| 人妻少妇精品视频专区vr| 一级白丝美女久久久久| 一区二区三区欧美高清| 成av一区二区三区久久| 成人午夜伦理在线观看| 日本黄色操碌缬巴| 91jk麻豆美女丝袜诱惑| 91人妻精品一区二区三区在线| 在线观看懂色精品大神视频| 欧美一级性生活片人与动物| 手机视频在线观看99精品视频 | 91福利精品一区二区| 亚洲精品成人原创视频| 国产黄色大片在线免费观看| 午夜精选视频在线观看| 女人样男人用大鸡巴操她的逼逼| 日韩无码成人电影一区二区|