设计后端逻辑功能
设计完界面后,需要完善相应的功能。初步尝试:1、登录;2、上传、加载分享信息两个功能
云函数设计
这里需要用到小程序的云开发功能,涉及到数据库、云函数等
首先设计云函数,这里创建三个云函数:1、login;2、downloadShare;3、uploadShare;分别用于登录、上传分享信息、加载分享信息。
函数按照功能大致分为
- 登录
- 上传分享
- 加载分享
- 获取收藏
- 上传收藏
- 删除收藏
登录函数
首先是登录函数如下:
exports.main = async(event, context) => {
// 获取 WX Context (微信调用上下文),包括 OPENID、APPID、及 UNIONID(需满足 UNIONID 获取条件)
const wxContext = cloud.getWXContext()
const db = cloud.database()
const users = db.collection("user")
const user = await users.where({
openid:wxContext.OPENID
}).get()
if(user.data.length==0)//判断是否存在这个用户,如果不存在,那么创建一个
await users.add({
data: {
openid: wxContext.OPENID,
favourites: [{}]
},
success(res) {
console.log(res)
}
})
return {
user,
openid: wxContext.OPENID,
appid: wxContext.APPID,
unionid: wxContext.UNIONID,
}
}
需要注意的是这里在main后面加上了‘async’,作为一个异步调用函数,然后在判断语句那里加入‘await’,让函数等待结果,不加的话在动作完成前函数就会结束,插入数据就会失败。
上传分享
主要代码如下:
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
const db = cloud.database()
const shares = db.collection("shares")
return await shares.add({
data:{
name:event.name,
url:event.url,
imgpath:event.imgpath,
date:db.serverDate(),
openid:wxContext.OPENID
},
success(res){
console.log(res)
}
})
}
约定的格式是用户的openid
、歌曲的name
、歌曲图片imgpath
、播放链接url
。这里用的添加函数要求用data字段把数据包含起来。
加载分享
主要代码:
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
const {id} = event
const db = cloud.database()
// 先取出集合记录总数
const countResult = await db.collection('shares').count()
const total = countResult.total
// 计算需分几次取
const batchTimes = Math.ceil(total / 100)
// 承载所有读操作的 promise 的数组
const tasks = []
for (let i = 0; i < batchTimes; i++) {
const promise = db.collection('shares').where({
openid:wxContext.OPENID
}).skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
tasks.push(promise)
}
// 等待所有
return (await Promise.all(tasks)).reduce((acc, cur) => ({
data: acc.data.concat(cur.data),
errMsg: acc.errMsg,
}))
return {
share
}
}
这里参考的是官网的例子,稍作更改。只需要获取用户的openid就可以得到该用户的分享。