####前言: 在學習雲開發的時候將本身的學習過程記錄下來了,放在了網上,收穫了一波好評,今天下午在辦公室沒有事情,也發現以前有人在博客裏面評論,你這個教程還有一半哩,多是csdn的自動搬運功能出來一點小問題,沒有搬運成功吧,這裏就手動複製粘貼成爲一篇了,篇幅比較長,若是有不足或者不注意寫錯的地方,歡迎你們提出糾正哦。html
####小程序雲開發實戰一:小程序掃一掃獲取到圖書ISBN碼(圖書條形碼)前端
接觸到雲函數已經有一段時間了,以前一直在看api,如今本身跟着網絡上的資料和視頻學習,作了一個小項目,相似於豆瓣讀書系列。 具體是這樣的一個流程,後面會一步步的實現。node
小程序掃碼實現讀取isbn,獲取圖書的各類信息 1:用戶端小程序調用 wx.scanCode接口,獲取到ISBN碼 2:使用ISBN碼調用雲函數,在請求雲函數的時候,雲函數會請求豆瓣的API,獲取豆瓣圖書信息。 3:圖書信息請求到以後,會將其中無用的信息返回給小程序中,小程序中再拿出獲取到的信息,建立圖書條目 4:將對應的數據直接存儲到雲開大的數據庫裏面git
以前用過微信掃一掃功能,調用二維碼,掃描本身生成的二維碼,並將二維碼的內容顯示在界面的兩個例子:github
微信小程序掃一掃的功能實現:www.jianshu.com/p/e00b44293… 小程序掃碼成功後帶着參數跳轉到指定頁面:www.jianshu.com/p/413c5831d…數據庫
如今是用戶端小程序調用 wx.scanCode接口,獲取到圖書ISBN碼(圖書條形碼),在辦公室找了一圈,找到了一本圖書ISBN碼,能夠自動忽略我這渣渣的像素。npm
在下面的示例代碼裏面,我是使用了小程序的組件庫的,若是有遇到引入庫的問題的能夠查看:小程序動端組件庫Vant Weapp的使用https://www.jianshu.com/p/10d75a3ca3d0編程
1:wxmljson
<van-button type="primary" bind:click="scanCode">掃碼加書</van-button>
複製代碼
2:json小程序
{
"usingComponents": {
"van-button": "../../vant/button/index"
}
}
複製代碼
3:js(page自動生成默認的各個函數,能夠本身手動刪除)
// pages/scanCode/scanCode.js
Page({
/**
* 頁面的初始數據
*/
data: {
},
/**
* 生命週期函數--監聽頁面加載
*/
onLoad: function (options) {
},
/**
* 生命週期函數--監聽頁面初次渲染完成
*/
onReady: function () {
},
/**
* 生命週期函數--監聽頁面顯示
*/
onShow: function () {
},
/**
* 生命週期函數--監聽頁面隱藏
*/
onHide: function () {
},
/**
* 生命週期函數--監聽頁面卸載
*/
onUnload: function () {
},
/**
* 頁面相關事件處理函數--監聽用戶下拉動做
*/
onPullDownRefresh: function () {
},
/**
* 頁面上拉觸底事件的處理函數
*/
onReachBottom: function () {
},
/**
* 用戶點擊右上角分享
*/
onShareAppMessage: function () {
},
scanCode: function (event) {
console.log(1)
// 容許從相機和相冊掃碼
wx.scanCode({
onlyFromCamera:true,
scanType:['barCode'],
success:res=>{
console.log(res.result)
},
fail:err=>{
console.log(err);
}
})
}
})
複製代碼
ok,獲取到信息
關於參考的視頻資料:能夠跟着視頻後面學習一下:cloud.tencent.com/developer/e…
####小程序雲開發實戰二:小程序雲開發雲函數安裝依賴步驟
1:安裝nodejs,準備好環境,這一步就不細說了,沒有安裝的能夠自行百度,不知道有沒有安裝的能夠輸入 node -v 查看一下。
2:新建一個雲函數模板,在cloudfunctions目錄底下,新建一個雲函數的文件bookinfo。
3:在新建文件上右擊文件,選擇在終端打開。
這個時候會彈出一個cmd窗口。
4:在cmd 打開雲函數目錄中,安裝依賴。 輸入命令:
npm install --production
複製代碼
依賴安裝成功以後,文件裏面多會出現package-lock.json
這個文件。
5:因爲要請求網絡,因此要安裝請求網絡的庫,請求網絡的庫可使用node.js中的request庫,方便快捷:github.com/request/req…
在小程序裏面要使用的雲函數是同步的,因此使用promise,由於使用傳統的callback沒有辦法在控制檯之中返回數據。
npm install --save request
npm install --save request-promise
複製代碼
ok,當文件上傳到雲端的時候,就會自動安裝相關依賴了。
####小程序雲開發實戰三:編寫雲函數代碼
1:在雲函數之中,拿到小程序端掃一掃獲取到的傳的編碼,該如何傳參?
經過看文檔能夠學會,在雲函數裏,咱們能夠經過傳遞一份data來獲取這裏面的數據,而後再經過event來拿到對應的數據。
2:複製這個api裏面的方法:
打開實戰一里面寫的小程序端的掃碼的js界面,把這個方法放在success
裏面。 要調用的雲函數的名稱name
:要改爲成實戰二教程裏面創建的雲函數bookinfo
3:繼續修改咱們要傳遞的參數 傳遞的參數是isbn
,結果是掃碼獲得的result
4:將result
的結果打印出來,ok,用戶端(小程序端)代碼寫好了。
用戶端(小程序端)代碼寫完了,就這些:
// pages/scanCode/scanCode.js
Page({
/**
* 頁面的初始數據
*/
data: {
},
scanCode: function(event) {
console.log(1)
// 容許從相機和相冊掃碼
wx.scanCode({
onlyFromCamera: true,
scanType: ['barCode'],
success: res => {
console.log(res.result)
//
wx.cloud.callFunction({
// 要調用的雲函數名稱
name: 'bookinfo',
// 傳遞給雲函數的參數
data: {
isbn: res.result
},
success: res => {
console.log(res)
},
fail: err => {
console.error(res)
}
})
},
fail: err => {
console.log(err);
}
})
}
})
複製代碼
####5:而後開始寫雲函數端代碼 打開bookinfo
裏面的index.js
,將event
結果打印出來,請求雲函數,將雲函數之中的isbn
返回回來
寫好了
// 雲函數入口文件
// const cloud = require('wx-server-sdk')
// cloud.init()
// 雲函數入口函數
//var rp = require('request-promise')
exports.main = async (event, context) => {
console.logI(event);
return event.isbn
// var res = rp('https://api.douban.com/v2/book/isbn/' + event.isbn).then(html => {
// return html;
// }).catch(err => {
// console.log(err)
// })
//return res
// const wxContext = cloud.getWXContext()
// return {
// event,
// openid: wxContext.OPENID,
// appid: wxContext.APPID,
// unionid: wxContext.UNIONID,
// }
}
複製代碼
右擊,上傳而且部署雲函數
測試一下,雲函數調用成功,返回的結果(控制檯打印)是isbn。
好的,雲函數代碼編寫已經完成。 接下來就是實戰四,調用豆瓣的API,實現具體的數據。
####小程序雲開發實戰四:調用豆瓣API獲取具體的數據
在網上找了一下,找到了一個能夠用的豆瓣API: api.douban.com/v2/book/isb…
1:打開雲函數文件夾,index.js裏面編寫代碼,引用request promise。
var rp = require('request-promise')
複製代碼
2:自定義的isbn,使用一個+號來鏈接,在傳遞一個catch來處理錯誤狀況。
var res = rp('https://api.douban.com/v2/book/isbn/'+event.isbn).then(html=>{
return html;
}).catch(err=>{
console.log(err)
})
複製代碼
3:return res
res就是對應的html,將html傳給用戶端。
// 雲函數入口文件
// const cloud = require('wx-server-sdk')
// cloud.init()
// 雲函數入口函數
var rp = require('request-promise')
exports.main = async(event, context) => {
// console.logI(event);
// return event.isbn
var res = rp('https://api.douban.com/v2/book/isbn/' + event.isbn).then(html => {
return html;
}).catch(err => {
console.log(err)
})
return res
// const wxContext = cloud.getWXContext()
// return {
// event,
// openid: wxContext.OPENID,
// appid: wxContext.APPID,
// unionid: wxContext.UNIONID,
// }
}
複製代碼
4:寫完以後上傳雲函數。
好了,繼續測試一下,拿到這個條形碼的信息了(書本的信息)。
5:對於這些信息,進一步處理,拿到本身想要的信息:,打開小程序端scanCode.js。
//進一步的處理方法
var bookString=res.result;
console.log(JSON.parse(bookString))
複製代碼
看到了整本圖書上面的全部信息,修改這些信息,存入雲數據庫之中便可。
####小程序雲開發實戰五:如何將獲取到的API數據存入雲數據庫裏面
以前的文章裏面已經詳細寫過像雲數據庫裏面插入數據的方法,如今用在實際項目裏面再寫一遍。
1:使用數據庫的時候,首先要進行初始化 雲開發數據庫文檔:
developers.weixin.qq.com/miniprogram… 2:打開雲開發控制檯 老規矩,建立一個集合 books
3:打開小程序端js, 初始化數據庫
//雲數據庫初始化
const db = wx.cloud.database({});
const book = db.collection('books');
複製代碼
4:添加數據(插入數據) js代碼流程
// pages/scanCode/scanCode.js
Page({
data: {
},
scanCode: function (event) {
console.log(1)
// 容許從相機和相冊掃碼
wx.scanCode({
onlyFromCamera: true,
scanType: ['barCode'],
success: res => {
console.log(res.result)
//
wx.cloud.callFunction({
// 要調用的雲函數名稱
name: 'bookinfo',
// 傳遞給雲函數的參數
data: {
isbn: res.result
},
success: res => {
// console.log(res)
//進一步的處理
var bookString = res.result;
console.log(JSON.parse(bookString))
//雲數據庫初始化
const db = wx.cloud.database({});
const book = db.collection('books')
db.collection('books').add({
// data 字段表示需新增的 JSON 數據
data: JSON.parse(bookString)
}).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})
},
fail: err => {
console.error(res)
}
})
},
fail: err => {
console.log(err);
}
})
}
})
複製代碼
5:代碼邏輯 1:點擊按鈕以後調用掃一掃scanCode 2:讀取照相機傳遞過來的圖片,拿到barCode的代碼 3:將拿到的barCode代碼傳遞給雲函數中的bookinfo,傳遞後將結果獲取到本地 4:用雲數據庫的示例去建立新的字段添加到數據庫之中
6:測試一下,好了,小程序端獲取的豆瓣API數據存入雲數據庫裏面了。
附上:
主要思路:
1:經過調用小程序的掃碼的api
2:調用雲函數獲取到圖書的信息,並將圖書信息傳遞到小程序
3:在小程序中 調用雲數據庫來添加
可能會有不少人有問,爲啥不直接在雲函數中完成添加?會更加簡單方便啊,暫時留個懸念啊啊哈。
複製代碼
####小程序雲開發實戰六:雲數據庫讀取的數據顯示在小程序端列表裏
讀取數據在以前也有詳細的寫過案例了,如今用在項目裏面,很容易就能理解了。
參考的讀取api,請點擊:developers.weixin.qq.com/miniprogram…
1:初始化 實例和book方法
//雲數據庫初始化
const db = wx.cloud.database({});
const book = db.collection('books')
複製代碼
2:複製API這段代碼獲取多個記錄的數據的方法,放在項目到onload方法之中
const db = wx.cloud.database({});
const cont = db.collection('books');
Page({
data: {},
onLoad: function(options) {
db.collection('books').get({
success(res) {
console.log(res.data)
}
})
},
})
複製代碼
3:打印在控制檯
4:拿到res.data以後,要賦值給page實例裏面的data 因此在data裏面設置一個默認的空數組
5:建立一個變量來保存頁面page示例中的this,方便後續使用 也可使用箭頭函數 來打印一下this,看是否是page示例
const db = wx.cloud.database({});
const cont = db.collection('books');
Page({
data: {
book_list:[]
},
onLoad: function(options) {
// 建立一個變量來保存頁面page示例中的this, 方便後續使用
var _this=this;
db.collection('books').get({
success: res =>{
console.log(res.data);
console.log(this);
}
})
},
})
複製代碼
6:直接使用this來設置data
7:顯示和佈局: 使用組件庫引入,能夠省略本身寫不少代碼的樣式,簡單方便,固然也能夠本身寫。youzan.github.io/vant-weapp/…
由於數據不止一條,循環,因此要用到小程序框架的列表渲染 developers.weixin.qq.com/miniprogram…
寫好以後 wxml以下:
<text>私家書櫃</text>
<view wx:for="{{book_list}}">
<van-card num="2" price="2.00" desc="描述信息" title="商品標題" />
</view>
複製代碼
8:先在js裏面打印一條具體的數據,方便渲染的時候寫出item.xxx的內容
9:小程序wxml界面
主要demo wxml:
<view wx:for="{{book_list}}">
<van-card num="2"
price="{{item.price}}"
desc="{{item.author}}"
title="{{item.title}}"
thumb="{{item.image }}" />
</view>
複製代碼
js
const db = wx.cloud.database({});
const cont = db.collection('books');
Page({
data: {
book_list:[]
},
onLoad: function(options) {
// 建立一個變量來保存頁面page示例中的this, 方便後續使用
var _this=this;
db.collection('books').get({
success: res =>{
console.log(res.data[0]);
this.setData({
book_list:res.data
})
}
})
},
})
複製代碼
ok,雲數據庫讀取的數據顯示在小程序端列表裏.
附錄:更多的雲開發參考資料和視頻 一個雲開發的demo:github.com/LWJcoder/qi… 雲開發圖書私房櫃:cloud.tencent.com/developer/e…
####小程序雲開發實戰七:雲開發首頁列表跳轉詳情頁
1:實戰六之中,列表頁已經完成,如今新建一個詳情頁,打開app.json,"pages/details/details",
,自動生成了一個詳情頁
2:打開首頁列表頁代碼,綁定詳情按鈕跳轉事件 wxml:
<view wx:for="{{book_list}}">
<van-card num="2" price="{{item.price}}" desc="{{item.author}}" title="{{item.title}}" thumb="{{item.image }}">
<view slot="footer">
<van-button size="mini" bind:click="viewitem">詳情按鈕</van-button>
</view>
</van-card>
</view>
複製代碼
3:繼續寫js裏面的綁定事件,在控制檯打印一下event,方便後續測試
viewitem: function(event) {
console.log(event)
}
複製代碼
4:如何知道要跳轉列表圖書中的哪一個詳情頁?要在雲開發裏面寫一個特定的id,打開雲開發控制檯,數據庫,須要用到這個下劃線是_id的字段
5:給這個字段設置一個值,data-id="{{item._id}}"
點擊按鈕,能夠看到,點擊不一樣的列表,打印的是不一樣的id,經過不一樣的id就能夠看到不一樣的內容了。
6:下面實現點擊詳情按鈕跳轉詳情頁面,看到想要的具體的內容,看完控制檯,由於具體數據是來自於event,currentTarget
var id = event.currentTarget.dataset.id;
複製代碼
而且寫好跳轉頁面的跳轉方法和url,帶參數跳轉
7:在detail.js的onLoad方法裏面打印接收到的參數
8:測試,列表界面帶參數跳轉成功
const db = wx.cloud.database({});
複製代碼
2:打開雲函數文檔裏面的讀取數據apihttps://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database/read.html 複製此段讀取數據記錄的代碼,放在onload裏面
onLoad: function (options) {
// console.log(options)
db.collection('books').doc(options.id).get({
success(res) {
// res.data 包含該記錄的數據
console.log(res.data)
}
})
},
複製代碼
能夠看到,具體數據已經打印過來了
這個時候尚未將數據傳遞到一個具體的頁面實例中
因此,success開始改爲使用箭頭函數
// pages/details/details.js
const db = wx.cloud.database({});
Page({
/**
* 頁面的初始數據
*/
data: {
},
onLoad: function (options) {
// console.log(options)
db.collection('books').doc(options.id).get({
success: res => {
console.log(res.data)
this.setData({
book: res.data
})
}
})
},
})
複製代碼
ok,進入頁面的時候,能夠看到appdata裏面的book
3:具體展現 在wxml裏面寫上想要拿到的數據,ok,詳情頁面展現的數據
4:效果以下
原文做者:祈澈姑娘 技術博客:www.jianshu.com/u/05f416aef… 90後前端妹子,愛編程,愛運營,文藝與代碼齊飛,魅力與智慧共存的程序媛一枚。 堅持總結工做中遇到的技術問題,堅持記錄工做中所所思所見,對於博客上面有不會的問題,能夠加入qq羣聊來問我:473819131。