前言
小程序在版本更新的时候,海轰准备添加一个每日签到的功能,也就是每个用户每天可以进行一次签到,获得一个积分。看似挺简单的每日签到,海轰还是琢磨了一下午的。
整体思路
- 第一步肯定是要判断用户是否授权了小程序,因为后面需要用到用户的详细信息,不授权,无法进行判断。判断是否授权,可以参考微信开发文档
- 第二步是判断用户是否在users记录中(users:用来存储登录小程序的用户集),若不存在,则上传用户信息到users中,存在则更新信息。
- 第三步,判断用户今日是否签到,这里海轰采用了一种比较笨的方法,在每一个用户信息记录中,额外增加了time字段,用来存入用户签到小程序的时间(年-月-日)。每一次签到之前,需要判断今日日期是否与time中的日期一致,一致则代表已签到。
程序运行界面
代码讲解
1.判断用户是否授权
// 查看是否授权
wx.getSetting({
success(res) {
if (res.authSetting['scope.userInfo']) {
// 已经授权,可以直接调用 getUserInfo 获取头像昵称
wx.getUserInfo({
success: function (res) {
console.log(res.userInfo)
k.setData({
name: res.userInfo.nickName,
img: res.userInfo.avatarUrl
})
}
})
}
else
{
k.setData({
isempower:false
})
}
}
})
2.判断用户是否存在于users记录中
db.collection('users').where({
_openid: openid // 填入当前用户 openid
}).count().then(res => {
console.log(res.total)
// 若users记录中没有该用户 则上传用户信息
if(res.total==0){
db.collection('users').add({
// data 字段表示需新增的 JSON 数据
data: {
user_openid:openid,
user_name:name,
user_img:img,
time:time,
nums:0
}
})
.then(res => {
console.log("上传用户成功")
wx.hideLoading()
})
.catch(console.error)
}
// 存在该用户
else{
console.log("存在该用户,不用重新上传")
wx.hideLoading()
}
})
k.setData({
isempower: true,
name:name,
img:img
})
}
3.签到
// 签到
signed(e){
var k=this
var openid=k.data.openid
var name=k.data.name
var img=k.data.img
var time=k.data.time
wx.showLoading({
title: '签到中...',
mask: true
})
// 防止老用户 已经授权 但users记录中没有该用户信息
db.collection('users').where({
_openid: openid // 填入当前用户 openid
}).count().then(res => {
console.log(res.total)
// 没有该用户
if(res.total==0)
{
db.collection('users').add({
// data 字段表示需新增的 JSON 数据
data: {
user_openid: openid,
user_name: name,
user_img: img,
time:time
}
})
.then(res => {
console.log("上传用户成功,下一步进行积分更新")
wx.cloud.callFunction({
// 要调用的云函数名称
name: 'HHPro_functions',
// 传递给云函数的event参数
data: {
function_name: "update_nums",
time: time,
openid:openid
}
}).then(res => {
console.log("积分+1")
wx.hideLoading()
k.setData({
issigned: true
})
k.onLoad()
}).catch(err => {
})
})
.catch(console.error)
}
// 有该用户 则更新积分 +1
else{
wx.cloud.callFunction({
// 要调用的云函数名称
name: 'HHPro_functions',
// 传递给云函数的event参数
data: {
function_name:"update_nums",
time:time,
openid: openid
}
}).then(res => {
console.log("积分+1")
k.setData({
issigned: true
})
wx.hideLoading()
k.onLoad()
}).catch(err => {
})
}
})
},
总结
开始的时候,感觉也是不好做,但是仔细思考,其实并不难。
只需要弄清楚一些逻辑关系即可。
有一些用户授权了,之后可能存在于users记录,也有可能不在
有些用户未授权,也有可能存在users记录(授权过期等情况)…
总之,逻辑一定要理清楚!!!
项目源码
需要源码的小伙伴
请前往海轰的微信公众号:海轰Pro
回复:海轰
即可