口袋工具之歷史上的今天 - 小程序雲開發實戰

前言

本項目是一個基於雲開發的小程序。javascript

本文選取項目中的一個頁面 -- 歷史上的今天 來作一個雲開發的分享,會涉及雲函數和雲數據庫。php

因爲是實戰項目,關於小程序的基礎知識請移步官方文檔,本文再也不贅述。html

項目地址

github.com/GoKu-gaga/t…java

項目預覽

  • 微信搜索: 口袋工具y
  • 掃一掃:

前期遇到的問題

  • 數據來源: 沒有數據,步履維艱呀

如何解決數據來源

因爲本人偷懶,因此選擇第二種方式,並最終選擇了聚合數據平臺API。node

項目開始

新建項目

  • 新建項目,配置好名稱、目錄、AppID等信息,後端服務選擇小程序·雲開發,點擊新建。ios

    關於AppID: 請自行修改成你註冊的小程序AppID。git

  • 點擊新建便可完成項目初始化,獲得一個雲開發模板:github

    目錄結構:

    +-- cloudfunctions|[指定的環境]  // 存放雲函數的目錄
      +-- miniprogram                 // 小程序代碼編寫目錄
      |-- README.md                   // 項目描述文件
      |-- project.config.json         // 項目配置文件
    複製代碼

新建雲開發環境

  • 點擊左上角菜單項 雲開發
  • 點擊建立資源環境,環境名稱及環境ID請自行設置:
  • 點擊肯定便可完成建立

編寫雲函數

1. 新建雲函數

在目錄 cloudfunctions 上右鍵
新建雲函數,填入新建雲函數的名稱(如todayInHistory
回車或失去焦點即會自動建立並上傳。數據庫

2. 安裝依賴

雲函數目前執行環境僅支持node,因此須要使用js來編寫雲函數的邏輯。 在控制檯中進入該雲函數的目錄,執行npm

npm i -S axios
複製代碼

本項目使用axios來執行請求的發送,可使用其餘如request-promise等等的庫來替換

3. 編寫雲函數

  • 新建config.js文件,添加代碼以下:
exports.key = YOUR_JUHE_KEY // 在聚合數據平臺申請的key
exports.baseUrl = 'http://v.juhe.cn/todayOnhistory/queryEvent.php'
複製代碼
  • 打開index.js文件,編寫代碼:
// 雲函數入口文件
const cloud = require('wx-server-sdk')
const axios = require('axios')

cloud.init()
const db = cloud.database()

// 聚合數據
const { baseUrl, key } = require('./config')

// 雲函數入口函數
exports.main = async(event, context) => {
  const {
    month,
    day
  } = event
 
  const resp = await axios.get(baseUrl, {
    params: {
      key,
      date: `${month}/${day}`
    }
  }).then(res => {
    return res.data
  })

  return resp.result
}
複製代碼

編寫頁面

1. 新建頁面

在開發小程序的過程當中,新建一個頁面是很常見的操做,有兩個很是方便的方式

  • app.json 文件中,在pages項添加咱們須要的頁面路徑,直接保存便可。如:

    "pages": [
      "pages/today-in-history/index"
    ]
    複製代碼
  • pages 目錄下新建目錄 today-in-history ,在新建的目錄上右鍵 -> 新建page, 填入名稱如index, 回車便可完成頁面下四個文件的建立

2. 編寫 index.wxml

<!--pages/today-in-history/index.wxml-->
<view class="container">
  <view class="header full-width">
    <view>{{year}}年{{month}}月{{day}}日</view>
  </view>
  <view class="content full-width">
    <view class="list-view">
      <block wx:for="{{list}}" wx:key="index">
        <navigator url="{{'/pages/history-detail/index?id=' + item.e_id}}" class="list-item">
          <view class="item-title">{{item.title}}</view>
          <view class="item-date">{{item.date}}</view>
        </navigator>
      </block>
    </view>
  </view>
</view>
複製代碼

3. 編寫 index.js

// pages/today-in-history/index.js
Page({

  /**
   * 頁面的初始數據
   */
  data: {
    year: 1990,
    month: 1,
    day: 1,
    list: []
  },

  /**
   * 生命週期函數--監聽頁面加載
   */
  onLoad: function() {
    const now = new Date();
    const year = now.getFullYear();
    const month = now.getMonth() + 1;
    const day = now.getDate();
    this.setData({
      year,
      month,
      day
    });
    this.doGetList();
  },

  /**
   * 執行數據獲取
   */
  doGetList: function() {
    const {
      month,
      day
    } = this.data;
    wx.cloud.callFunction({
        name: 'todayInHistory',
        data: {
          month,
          day
        }
      }).then(res => {
        let list = res.result.reverse();
        this.setData({
          list
        });
      })
      .catch(console.error)
  }
})
複製代碼

4. 編寫 index.wxss

/* pages/today-in-history/index.wxss */
.container {
  padding-bottom: 20rpx;
  background-color: #E8D3A9;
}

.header {
  display: flex;
  justify-content: space-around;
  align-items: center;
  height: 80rpx;
  color: #FFF;
}

.content {
  flex: 1;
}

.list-view {
  height: 100%;
  display: flex;
  flex-direction: column;
  padding: 0 20rpx;
}

.list-item {
  display: flex;
  flex-direction: column;
  border-radius: 10rpx;
  padding: 16rpx 0;
  box-sizing: border-box;
  margin-top: 20rpx;
  background-color: #fff;
  text-align: center;
  box-shadow: 1px 1px 5px 1px rgb(207, 207, 207);
}

.item-title {
  font-size: 36rpx;
  padding: 10rpx 16rpx;
  color: #262626;
  line-height: 48rpx;
}

.item-date {
  font-size: 24rpx;
  height: 30rpx;
  line-height: 30rpx;
  border-top: 2rpx solid #eee;
  padding: 10rpx 16rpx 0;
  color: #595959;
  margin-top: 6rpx;
}
複製代碼

補充

  • 項目中也使用了部分的有讚的小程序組件庫 vant-weapp

  • 因爲聚合數據平臺API非會員調用次數有限(100次/天),明顯是不太夠用的。所以,咱們能夠考慮在請求到數據時,將數據存在雲數據庫中,其實也就實現了一個相似爬蟲的功能啦。流程以下:

    代碼實現:

    • 修改 cloudfunctions/todayInHistory/index.js
      // ... 省略其餘無需改動的代碼
      exports.main = async(event, context) => {
        const {
          month,
          day
        } = event
      
        const ret = await db.collection('todayInHistory').where({
          date: `${month}/${day}`
        }).get()
      
        if (ret.data.length > 0) {
          return ret.data[0].result
        }
      
        const resp = await axios.get(baseUrl, {
          params: {
            key,
            date: `${month}/${day}`
          }
        }).then(res => {
          return res.data
        })
        
        await db.collection('todayInHistory').add({
          data: {
            date: `${month}/${day}`,
            result: resp.result
          }
        })
      
        return resp.result
      }
      複製代碼

以上即爲 歷史上的今天 頁面的數據獲取及展現,其餘頁面使用到雲開發的模式基本大同小異。

結語

目前只開發了兩個小功能 歷史上的今天周公解夢,後續會繼續開發新的功能,但願能夠作成一個小工具集合,這也是口袋工具這個名稱的由來。

感謝各位讀者的閱讀,因爲本人水平有限,文章中若有錯誤或不妥之處,請不吝賜教!

若是你喜歡這篇文章或是這個項目,不妨進去點個Star支持下 today

相關文章
相關標籤/搜索