本項目是一個基於雲開發的小程序。javascript
本文選取項目中的一個頁面 -- 歷史上的今天
來作一個雲開發的分享,會涉及雲函數和雲數據庫。php
因爲是實戰項目,關於小程序的基礎知識請移步官方文檔,本文再也不贅述。html
口袋工具y
因爲本人偷懶,因此選擇第二種方式,並最終選擇了聚合數據平臺API。node
新建項目,配置好名稱、目錄、AppID等信息,後端服務選擇小程序·雲開發
,點擊新建。ios
關於AppID: 請自行修改成你註冊的小程序AppID。git
點擊新建便可完成項目初始化,獲得一個雲開發模板:github
+-- cloudfunctions|[指定的環境] // 存放雲函數的目錄
+-- miniprogram // 小程序代碼編寫目錄
|-- README.md // 項目描述文件
|-- project.config.json // 項目配置文件
複製代碼
雲開發
在目錄
cloudfunctions
上右鍵
新建雲函數,填入新建雲函數的名稱(如todayInHistory
)
回車或失去焦點即會自動建立並上傳。數據庫
雲函數目前執行環境僅支持node,因此須要使用js來編寫雲函數的邏輯。 在控制檯中進入該雲函數的目錄,執行npm
npm i -S axios
複製代碼
本項目使用axios來執行請求的發送,可使用其餘如request-promise等等的庫來替換
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
}
複製代碼
在開發小程序的過程當中,新建一個頁面是很常見的操做,有兩個很是方便的方式
在 app.json
文件中,在pages項添加咱們須要的頁面路徑,直接保存便可。如:
"pages": [
"pages/today-in-history/index"
]
複製代碼
在 pages
目錄下新建目錄 today-in-history
,在新建的目錄上右鍵 -> 新建page, 填入名稱如index
, 回車便可完成頁面下四個文件的建立
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>
複製代碼
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)
}
})
複製代碼
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。