小程序云開發(fā)學(xué)習(xí)
最近在學(xué)習(xí)云開發(fā),于是將之前的小程序(接口服務(wù)基于koa2)用云開發(fā)做了重構(gòu),學(xué)以致用哈哈。歡迎各位一起討論,學(xué)習(xí)~
部分功能截圖:
功能介紹
- 發(fā)現(xiàn):banner(熱點) + 熱門比賽
- 聯(lián)賽:聯(lián)賽列表 + 聯(lián)賽詳細(xì)信息
- 比賽:圖文直播 + 比賽詳細(xì)數(shù)據(jù)
- 好看:比賽視頻、視頻集錦等
- 其它...
技術(shù)點
- 接口服務(wù):云開發(fā)全家桶(云函數(shù)+存儲+云數(shù)據(jù)庫+定時觸發(fā)器+事件觸發(fā)器+云調(diào)用)
- 小程序端:原生開發(fā),半屏小程序接入實踐
項目結(jié)構(gòu)
項目整體結(jié)構(gòu)分: cloudfunctions和miniprogram兩大部分,其中cloudfunctions是各個云函數(shù),提供功能接口,部分是云函數(shù)定時任務(wù)、事件觸發(fā)器;miniprogram是小程序部分的代碼。如下圖:
第三方服務(wù)
- 接口服務(wù):steamwebpai
- 小程序:bilibili小程序(半屏嵌入)
云函數(shù)- CRUD篇
在云函數(shù)中通過調(diào)用數(shù)據(jù)庫的增刪查改API來完成對數(shù)據(jù)的CRUD,如下是一個查詢比賽預(yù)告的操作:
const cloud = require('wx-server-sdk');
cloud.init();
const db = cloud.database();
const collection = db.collection("match-schedule");
const _ = db.command;
exports.main = async (event) => {
try {
const {
limit = 10,
skip = 0,
league_id
} = event;
const timestamp = Date.now() / 1000;
const whereObj = league_id ? {
league_id,
scheduled_time: _.gt(timestamp)
} : {
scheduled_time: _.gt(timestamp)
};
const result = await collection.where(whereObj).orderBy('scheduled_time', 'asc').skip(skip).limit(limit).get();
return {
code: 0,
data: {
list: result.data
}
}
} catch (err) {
console.log('getMatchSchedule err...', err)
return {
code: -1,
msg: err
}
}
}
定時觸發(fā)器
如果云函數(shù)需要定時 / 定期執(zhí)行,也就是定時觸發(fā),我們可以使用云函數(shù)定時觸發(fā)器。通過這個,我們可以實現(xiàn)一些定時任務(wù),以達(dá)到獲取實時數(shù)據(jù)的目的。例如在這個小程序中實現(xiàn)的定時任務(wù)有:定時請求steam web api獲取進(jìn)行中的比賽數(shù)據(jù),定時請求第三方api接口獲取比賽預(yù)告數(shù)據(jù)等。
事件觸發(fā)器
提供針對事件變化來自動觸發(fā)云函數(shù)的能力。例如集合文檔的變更,存儲資源的變更等。通過事件觸發(fā)器,可以更加靈活的進(jìn)行業(yè)務(wù)邏輯的開發(fā)。如下的同步聯(lián)賽數(shù)據(jù)觸發(fā)器:當(dāng)集合leauge的sync_status字段=1(更新操作)時,將自動執(zhí)行云函數(shù)syncLeagueData。
云調(diào)用
云調(diào)用是云開發(fā)提供的基于云函數(shù)使用小程序開放接口的能力。在云函數(shù)中使用云調(diào)用調(diào)用服務(wù)端接口無需換取 access_token,只要是在從小程序端觸發(fā)的云函數(shù)中發(fā)起的云調(diào)用都經(jīng)過微信自動鑒權(quán)。如下是一個在云函數(shù)調(diào)用圖片內(nèi)容安全接口(鑒黃)的例子:
const cloud = require('wx-server-sdk');
exports.main = async (event, context) => {
const { imageBuffer } = event.params;
try {
const res = await cloud.openapi.security.imgSecCheck({
media: {
contentType: 'image/png',
value: imageBuffer
}
});
return {
code: 0,
data: res
}
} catch (err) {
return {
code: -1,
msg: err
}
};
}
附言
篇幅所限,有興趣的小伙伴可以點擊進(jìn)入我的個人主頁(然后掃個人案例中的小程序碼),或微信搜索 MatchBox 小程序,歡迎體驗,交流討論、建議等。

浙公網(wǎng)安備 33010602011771號