习惯养成之打卡
背景
上文已经实现了小程序的注册登陆功能,正式开始实现核心的打卡功能
创建新的数据库
创建了新数据库daka,存储打卡的流水记录,存储数据格式如下:
"_id": XPNwQhJZb-wmU-SO
"addr": https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTKkpsJPqLjxu5oZ5pp9VxwgjlTQITMOPjkca2Trfjy4sUHR4iaH6OP1swruKLR6niaHVLf2maB0R7Ew/132
"day": 02
"hour": 06
"minute": 05
"month": 06
"second": 05
"username": 张小帅
"year": 2019
记录了打卡的时间,用户名以及头像地址
打卡功能实现
想要实现打卡需要实现记录打卡的时间将其存入数据库中,记录下所有用户打卡的记录,方便后面的读取
获取当前时间
获取当前时间,看教程都说创建小程序就会给自动给,然而云开发好像没有,自己创建了一个util.js文件
const formatTime = date => {
const y = date.getFullYear()
const mo = date.getMonth() + 1
const d = date.getDate()
const h = date.getHours()
const m = date.getMinutes()
const s = date.getSeconds()
return { year: formatNumber(y), month: formatNumber(mo), day: formatNumber(d), hour: formatNumber(h), minute: formatNumber(m), second: formatNumber(s)}
}
function formatNumber(n) {
n = n.toString()
return n[1] ? n : '0' + n
}
module.exports = {
formatTime: formatTime
}
然后直接调用即可,就不单独给代码了懒得抄官方文档了,看了教程搜到的基本都是抄官方文档的
打卡实现
实现按钮函数打卡,首先判定其是否有今日的打卡记录,然后如果没有打卡则将当前时间以及个人信息存储到数据库daka中,并修改user库中该用户的分数(修改规则后期补充,暂时为打一次卡加两分)
btn_click: function(){
var that = this
var mydata = util.formatTime(new Date())
wx.cloud.callFunction({
name: 'database',
data: {
type: "get", //指定操作是insert
db: "daka", //指定操作的数据表
limit: 10,
skip: 0,
//condition: { student_id: app.globalData.mine.student_id }
condition: { year: mydata.year, month: mydata.month, day: mydata.day, username: app.globalData.mine.username }
},
success: function (res) {
if(res.result.data.length != 0){
wx.showToast({
title: '今日已打卡',
icon: 'loading'
})
}
else{
//这里添加加分条件实现不同时段加分不同
app.globalData.mine.score = app.globalData.mine.score + 2
wx.cloud.callFunction({
name: 'database',
data: {
type: "update", //指定操作是insert
db: "user", //指定操作的数据表
condition: { student_id: app.globalData.mine.student_id },
data: { //指定insert的数据
//groupID: wx.getStorageSync("groupID"),
//subject: ["语文soc", "数学", "英语", "物理", "化学", "历史", "地理", "政治"]
score: app.globalData.mine.score
}
},
success: function (res) {
wx.cloud.callFunction({
name: 'database',
data: {
type: "insert", //指定操作是insert
db: "daka", //指定操作的数据表
data: { //指定insert的数据
username: app.globalData.mine.username,
addr: app.globalData.avatarUrl,
year: mydata.year,
month: mydata.month,
day: mydata.day,
hour: mydata.hour,
minute: mydata.minute,
second: mydata.second
}
},
success: function (res) {
wx.showToast({
title: '打卡成功 +2分',
icon: 'success'
})
},
error: function (error) {
console.log(error)
}
});
},
error: function (error) {
console.log(error)
}
})
}
},
error: function (error) {
console.log(error)
}
});
},
打卡排行榜
从daka数据库中获取打卡记录,将今日打卡记录进行时间排行,展示出前十名打卡的人员信息
tempData: function(){
var that = this
var mydata = util.formatTime(new Date())
console.log(mydata)
var results = []
wx.cloud.callFunction({
name: 'database',
data: {
type: "get", //指定操作是insert
db: "daka", //指定操作的数据表
limit: 10,
skip: 0,
//condition: { student_id: app.globalData.mine.student_id }
condition: { year: mydata.year, month: mydata.month, day: mydata.day }
},
success: function (res) {
for(var i = 0; i < res.result.data.length; i++){
console.log(res.result)
var object = res.result.data[i]
var result = {}
result.time = object.hour + ":" + object.minute + ":" + object.second
result.rank = i+1
result.avatar = object.addr
result.username = object.username
results[i] = result
}
console.log(results);
that.setData({
list: results
});
},
error: function (error) {
console.log(error)
}
});
},
bugbugbug
- 注册时没用设置输入手机号检测。。。没有输入手机号就能注册
- 打卡按钮没用设置不能连续按,由于云函数调用过慢,连续按会同时执行。。导致打卡判定都会判定没有打卡,导致重复打卡
- 排行榜的刷新需要重新登入才能刷新,没有设置下拉刷新
总结
自此小程序打卡底层代码功能基本实现,后期会做一些bug修复以及优化,github源码地址:https://github.com/wechat-small-program/Habit-of-developing,大家阔以随意转载,star或者fork