小程序云开发:私家书柜
原教学视频:
https://cloud.tencent.com/edu/learning/learn-100005-1244/3154
由于豆瓣获取图书ISBN的API已暂停开放,故本文采用极速数据提供的免费API:
https://www.jisuapi.com/
整个文档结构如下:
共有三个页面,index页面内以卡片的形式展示所有书目;scanCode页面用于扫码;bookDetail页面展示图书的详细信息。
一、云函数的使用
(1)新建云函数
1、新建一个云函数,命名为‘bookinfo’,用于调用API接口获取图书的ISBN码,并将图书信息储存至云数据库;
2、安装依赖:右击该云函数,选择在终端打开,输入命令:
npm install --production
依赖安装成功之后,文件里面多会出现package-lock.json这个文件。
3、由于要请求网络,所以要安装请求网络的库,请求网络的库可以使用node.js中的request库。
在终端中输入:
npm install --save request
npm install --save request-promise
(2)编写云函数代码
bookinfo下的index.js:
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
var rp = require('request-promise')
// 云函数入口函数
exports.main = async (event, context) => {
var res = rp('https://api.jisuapi.com/isbn/query?appkey=44898c9b893f35ce&isbn=' + event.isbn).then(html => {
return html;
}).catch(err => {
console.log(err)
})
return res;
}
其中https://api.jisuapi.com/isbn/query?appkey=44898c9b893f35ce&isbn=xxx 是一个免费的查询图书ISBN的接口,该云函数就实现了调用这个接口并返回图书数据。
(3)调用云函数
我们在scanCode页面调用bookinfo云函数,在scanCode中放一个扫码按钮:
<van-button type="primary" bind:click="scanCode">扫码加书</van-button>
样式采用有赞UI组件。有赞UI组件的使用详见https://blog.csdn.net/weixin_42195593/article/details/90270436
需要在scanCode.json中添加依赖:
"usingComponents": {
"van-button":"../../vant/button/index"
}
该按钮的点击事件:
scanCode: function (event) {
wx.scanCode({
onlyFromCamera: true,
scanType: ['barCode'],
success: res => {
console.log(res.result);//图书的ISBN码
wx.cloud.callFunction({
// 要调用的云函数名称
name: "bookinfo",
// 传递给云函数的参数
data: {
isbn: res.result
},
success: res => {
var bookString = res.result;
console.log("调用接口成功");
//console.log(res);
console.log(JSON.parse(bookString).result);
//云数据库初始化
const db = wx.cloud.database();
const book = db.collection('mybook');
db.collection('mybook').add({
// data 字段表示需新增的 JSON 数据
data: JSON.parse(bookString).result
})
.then(res => {
console.log("储存成功!")
}).catch(err => {
console.log(err)
})
},
fail: err => {
console.log(err);
},
})
},
fail: err => {
console.log(res);
}
})
}
点击按钮,即调用云函数bookinfo,返回图书数据,并接着把数据上传至云数据库。
二、从云数据库读取数据
在index页要显示所有图书的信息,因此需要从数据库读取图书数据。
在index.js中:
const db = wx.cloud.database({});//首先获得数据库实例
Page({
/**
* 页面的初始数据
*/
data: {
booklist: [],
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
var that = this;
db.collection('mybook').get({
success: res =>{
console.log(res.data[0]);
this.setData({
booklist: res.data
})
}
})
}
index.wxml:
<view wx:for="{{booklist}}">
<van-card price="{{item.price}}" desc="{{item.author}}" title="{{item.title}}" thumb="http://www.books88.com/Books_Pic/20080508/L9787507828313.jpg">
<view slot="tags">
<van-tag type="primary">{{item.keyword}}</van-tag>
</view>
<view slot="footer">
<van-button data-id="{{item._id}}" size="small" type='primary' plain bind:click='viewItem'>详情</van-button>
</view>
</van-card>
</view>
其中要用到有赞UI组件中的card组件,https://youzan.github.io/vant/#/zh-CN/card
并且在每个card上添加‘详情’按钮,用于跳转至每本书的详情页面。
三、云数据库的增删改查
可以在小程序端对云数据库进行增删改查。
当在index页点击某本书的详情按钮时,会跳转到相应图书的详情页面,因此需要传递所点击的图书的id。
首先为详情按钮写点击事件:
viewItem:function(event){
//console.log(event);
var id = event.currentTarget.dataset.id;
wx.navigateTo({
url: '../bookDetail/bookDetail?id='+id,
})
}
跳转到bookDetail页后,会根据所携带的id号去云数据库查询该id所对应的所有数据,保存并显示在详情页。
在bookDetail的onload函数里:
onLoad: function (options) {
//console.log(options);
db.collection('mybook').doc(options.id).get({
success: res => {
// res.data 包含该记录的数据
this.setData({
book: res.data,
id: options.id
});
},
fail: err => {
console.error(err);
}
})
}
对于更新和删除操作,
首先在bookDetail页面新建两个按钮,用于更新和删除操作:
bookDetail.wxml:
<van-button type="warning" bind:click="update">更新</van-button>
<van-button type="danger" bind:click="delete">删除</van-button>
在bookDetail.js编写相应的点击函数:
更新数据:
update:function(event){
console.log(event);
db.collection('mybook').doc(this.data.id).update({
// data 传入需要局部更新的数据
data: {
// 表示将 done 字段置为 true
title: "啦啦啦"
},
success(res) {
console.log(res)
}
})
}
删除操作:
delete: function(event){
db.collection('mybook').doc(this.data.id).remove({
success(res) {
console.log(res)
}
})
}