4.5 实现投票小程序服务端功能
4.5.1 完成获取投票信息功能
修改pages/vote/vote.js文件中getVoteDataFromServer函数,代码如下:
getVoteDataFromServer(voteID) {
const db = wx.cloud.database()
db.collection('votes').doc(voteID).get().then(res => { // 根据投票ID获取投票信息
const voteData = res.data
const isExpired = this.checkExpired(voteData.endDate) //检查投票是否已经过期
this.setData({ // 将获取到的投票信息更新到data对象中
voteID,
type: voteData.type,
voteTitle: voteData.voteTitle,
voteDesc: voteData.voteDesc,
optionList: voteData.optionList,
endDate: voteData.endDate,
isAnonymous: voteData.isAnonymous,
isExpired
})
}).catch(res => {
console.error(res)
wx.showToast({
title: '获取投票失败',
icon: 'none'
})
})
}
实现getVoteStatusFromServer功能,需要知道openid,小程序端无法获取当前用户的openid,因此需要借助云函数实现。首先在新建一个名为getVoteStatus的云函数目录,该目录下的index.js代码如下:
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
const openid = wxContext.OPENID // 获取用户的openid
/**
* 根据投票ID获取投票记录
* 使用await关键字可以直接获取Promise过程中then函数中的res的值
* await关键字必须在被声明为async的函数中使用
*/
const res = await db.collection('votes').doc(event.voteID).get()
const optionListLength = res.data.optionList.length // 获取投票选项的个数
const voteLsit = res.data.voteLsit // 获取所有用户的投票列表
const alreadyVoted = checkAlreadyVoted(voteList, openid)
const totalVoteCount = getTotalVoteCount(voteList)
const optionStatus = getOptionStatus(voteList, openidd, optionLength)
return {
event,
openid: wxContext.OPENID,
appid: wxContext.APPID,
unionid: wxContext.UNIONID,
alreadyVoted, //当前用户是否已经投票
totalVoteCount, //总投票数量
optionStatus //每个选项的投票情况
}
}
function checkAlreadyVoted(voteList, openid){}
function getTotalVoteCount(voteList){}
function getOptionStatus(voteList, openidd, optionLength){}
三个计算函数下次补上。
最后在小程序端调用云函数的代码,将getVoteStatusFromServer函数修改为以下代码:
getVoteStatusFromServer(voteID){
wx.cloud.callFunction({
name: 'getVoteStatus',
data: {
voteID
}
}).then(res => {
console.log(res)
this.setData({
voteStatus: res.result
})
}).catch(res => {
console.error(res)
wx.showToast({
title: '获取投票数据失败',
icon: 'none'
})
})
}