小程序入門案例教學 - 手機歸屬地查詢

手機歸屬地查詢

源碼php

微信小程序練手 Demo,基本功能css

  • 查詢手機歸屬地html

  • 根據歷史記錄查詢git

  • 手機位數校驗github

界面預覽json

初始化

建立空白項目

新建一個空白項目小程序

  • AppID 可選擇無微信小程序

  • 不選擇中建立 quick start 項目,而是建立空白項目,方便加深理解api

基本配置

首先,建立全局配置文件 app.json數組

/app.json
{
  "pages":[
    "pages/index/index"
  ]
}

定義了首頁的路徑,保存以後,將會自動生成 index 的目錄

pages
└── index
    ├── index.js    // 頁面業務邏輯
    ├── index.json  // 頁面配置
    ├── index.wxml  // 頁面視圖
    └── index.wxss  // 頁面樣式

如今,還缺乏一個應用的入口文件,用來註冊小程序

/app.js
App({
})

到這一步,小程序初始化就完成了。

功能實現

下圖來源於小程序設計指南,咱們但願作出來的東西效果能與該圖較爲接近

頁面配置

首先,咱們來爲頁面添加頂部導航文字

/pages/index/index.json
{
  "navigationBarTitleText": "手機歸屬地查詢"
}

查詢模塊

接下里是查詢模塊

/pages/index/index.wxml
<!--查詢-->
<view>
  <text>請輸入查詢內容</text>
  <input type="number" bindinput="bindPhoneInput" value="{{ phoneNumber }}"/>
  <button type="primary" bindtap="queryPhoneInfo" disabled="{{ disabled }}">查詢</button>
</view>

說明

  • bindinput 用於綁定鍵盤輸入事件,意味着用戶輸入後,觸發 bindPhoneInput 函數

  • bindtap 用於綁定點擊事件,意味着用戶點擊按鈕後,出發 queryPhoneInfo 函數

  • 按鈕是否可點擊取決於 disabled 的值;

接下里是具體的功能實現,首先,咱們把手機歸屬地查詢的功能放在全局業務文件 app.js 中,方便不一樣頁面使用

/app.js
App({
  /**
   * 獲取手機歸屬地信息
   */
  getPhoneInfo(phoneNum, callback) {
    wx.request({
      url:
      'https://www.iteblog.com/api/mobile.php?mobile=' + phoneNum,
      header: {
        'content-type': 'application/json'
      },
      success: function (res) {
        callback(res.data);
      }
    })
  }
})

說明

  • 使用小程序提供的 wx.request 發送請求;

  • 該函數接受兩個參數,一個是手機號,另一個則是用來處理查詢結果的回調函數

在頁面裏面實現剛纔定義的兩個事件

/pages/index/index.js
var app = getApp();
Page({

  /**
   * 頁面的初始數據
   */
  data: {
    phoneNumber: null, // 查找的手機號
    phoneInfo: null, // 查詢結果
    disabled: true  // 默認不可查詢
  },

   /**
   * 鍵盤輸入手機號事件處理
   */
  bindPhoneInput(event){
    this.setData({
      phoneNumber: event.detail.value,  // 綁定用戶輸入的手機號
      phoneInfo: null   //  清空過往查詢結果
    })
    this.setDisabled();
  },

  /**
   * 驗證手機是否爲 11 位
   */
  setDisabled() {
    this.setData({
      disabled: (this.data.phoneNumber && this.data.phoneNumber.toString().length === 11) ? false : true
    })
  },
  
  /**
   * 用戶點擊查詢處理
   */
  queryPhoneInfo() {
    app.getPhoneInfo(this.data.phoneNumber, data => this.setData({
      phoneInfo: data
    }));
  }
})

說明

  • data 用於管理該頁面的數據;

  • this.setData() 方法用於設置 data 的屬性,若是直接使用 this.data.phoneInfo 沒法改變頁面狀態;

  • 在頁面中調用 app 的方法,須要先使用 getApp 進行實例化,而後經過實例來訪問方法;

查詢結果顯示

接下來在視圖裏面顯示查詢結果

/pages/index/index.wxml
<!--查詢-->


<!--查詢結果-->
<view>
 
  <view wx:if="{{ phoneInfo }}">
   <text>查詢結果爲:</text>
   <!--手機號存在-->
   <text wx:if="{{phoneInfo.ret === 0}}">
   {{phoneInfo.operator}}{{phoneInfo.province}}{{phoneInfo.city}}
   </text>
   <!--手機號不存在-->
  <text wx:else> {{phoneInfo.msg}} </text>
  </view>
</view>

說明 - 使用 wx:ifwx:else 能夠方便的根據查詢結果來切換視圖

最近搜索功能實現

最後是最近功能記錄的功能實現,首先是視圖

<!--最近搜索-->
<view>
  <text>最近搜索</text>
  <view>
    <view wx:for="{{ historyList }}"  bindtap="selectHistory" data-number="{{item}}">
       {{item}}
    </view>
  </view>
</view>

說明:

  • 遍歷 historyList 數組

  • 用戶點擊某一記錄時候,觸發 selectHistory 事件

  • 將每條手機號保存到 data-number 中,selectHistory 就能夠獲取對應的手機號了

業務邏輯

// pages/index/index.js
var app = getApp();
Page({

  /**
   * 頁面的初始數據
   */
  data: {
    phoneNumber: null, // 查找的手機號
    phoneInfo: null, // 查詢結果
    historyList: [],  // 查詢歷史
    disabled: true
    
  },

  /**
   * 鍵盤輸入手機號事件處理
   */
  bindPhoneInput(event){
    this.setData({
      phoneNumber: event.detail.value,  // 綁定用戶輸入的手機號
      phoneInfo: null   //  清空過往查詢結果
    })
    this.setDisabled();
  },

  /**
   * 驗證手機是否爲 11 位
   */
  setDisabled() {
    this.setData({
      disabled: (this.data.phoneNumber && this.data.phoneNumber.toString().length === 11) ? false : true
    })
  },

  
  /**
   * 用戶點擊查詢處理
   */
  queryPhoneInfo() {
    app.getPhoneInfo(this.data.phoneNumber, data => this.setData({
      phoneInfo: data
    }));
    this.addQueryHistory(this.data.phoneNumber); // 添加搜索記錄
  },

  /**
   * 將搜索記錄添加到緩存
   */
  addQueryHistory(phoneNumber) {
    var historyList = wx.getStorageSync('historyList') || [];
    if (historyList.indexOf(phoneNumber) === -1) {
      historyList.unshift(phoneNumber);
      wx.setStorageSync('historyList', historyList);
    }
    this.setData({
      historyList: historyList
    })
  },

  /**
   * 頁面加載後,從緩存中讀取最近搜索列表
   */
  onLoad: function () {
    this.setData({
      historyList: wx.getStorageSync('historyList') || []
    })
  },

  /**
   * 用戶點擊記錄以後,將其添加到輸入框中
   */
  selectHistory(event) {
    this.setData({
      phoneNumber: event.currentTarget.dataset.number,
      disabled: false
    })
  }

})

界面美化

最後,只須要美化下界面便可。

視圖

<!--查詢-->
<view class="querySection">
  <text class="help-text">請輸入查詢內容</text>
  <input class="queryInput" type="number" bindinput="bindPhoneInput" value="{{ phoneNumber }}"/>
  <button class="queryBtn" type="primary" bindtap="queryPhoneInfo" disabled="{{ disabled }}">查詢</button>
</view>

<!--查詢結果-->
<view>
  <view wx:if="{{ phoneInfo }}">
  <text class="help-text">查詢結果爲:</text>
   <!--手機號存在-->
   <text wx:if="{{phoneInfo.ret === 0}}">
   {{phoneInfo.operator}}{{phoneInfo.province}}{{phoneInfo.city}}
   </text>
   <!--手機號不存在-->
  <text wx:else> {{phoneInfo.msg}} </text>
  </view>
</view>

<!--最近搜索-->
<view>
  <text class="help-text">最近搜索</text>
  <view class="items">
    <view class="item" wx:for="{{ historyList }}"  bindtap="selectHistory" data-number="{{item}}">
       {{item}}
    </view>
  </view>
</view>

樣式

/* pages/index/index.wxss */

page {
  background-color: #EFEFF4;
  font-family: -apple-system-font,Helvetica Neue,Helvetica,sans-serif;
}

.querySection {
  display: flex;
  flex-direction: column;
  margin-top: 35px;
}

.help-text {
  font-size:14pt;
  color:#888888;
  margin-left:15px;
}

.queryInput {
  width:100%;
  background-color: #FFFFFF;
  height: 75px;
  margin:10px auto;
}

.queryBtn {
  margin:15px;
}

.items {
  display: flex;
  flex-wrap: wrap;
}

.item {
  margin:20px;
  background-color: #D2D2D2;
  padding: 13px;
  color:#FFFFFF;
  border-radius:20px;
}

.queryRst {
  margin:20px;
}
相關文章
相關標籤/搜索