signIn.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // 开发文档:https://uniapp.dcloud.io/uniCloud/clientdb?id=action
  2. const db = uniCloud.database();
  3. const dbCmd = db.command
  4. const signInTable = db.collection('opendb-sign-in');
  5. const scoresTable = db.collection('uni-id-scores');
  6. module.exports = {
  7. before: async (state, event) => {
  8. // console.log({state});
  9. if(state.type == 'create'){
  10. let date = todayTimestamp()
  11. let {total} = await signInTable.where({
  12. user_id:state.auth.uid,
  13. date,
  14. isDelete:false
  15. }).count()
  16. console.log(total);
  17. if(total){
  18. throw new Error("今天已经签到")
  19. }
  20. state.newData.date = date
  21. state.newData.isDelete = false
  22. }
  23. },
  24. after: async (state, event, error, result) => {
  25. if (error) {
  26. throw error
  27. }
  28. let date = todayTimestamp()
  29. //查最近7天的签到情况
  30. let {data:signInData} = await signInTable.where({
  31. user_id:state.auth.uid,
  32. date:dbCmd.gte(date-3600*24*6*1000),
  33. isDelete:false
  34. }).get()
  35. let allDate = signInData.map(item=>item.date)
  36. //今天是本轮签到的第几天
  37. const n = ( date - Math.min(...allDate) )/3600/24/1000+1;
  38. //换成数字--第几天
  39. let days = signInData.map(item=>{
  40. return (n*10000 - (date - item.date)/3600/24/1000*10000)/10000 -1
  41. })
  42. //查出来用户当前有多少积分
  43. let {data: [userScore]} = await scoresTable
  44. .where({user_id:state.auth.uid})
  45. .orderBy("create_date", "desc")
  46. .limit(1)
  47. .get()
  48. let balance = 0
  49. if(userScore){
  50. balance = userScore.balance
  51. }
  52. if(state.type == 'create'){
  53. if(n == 7){ //如果已经满一轮就软删除之前的内容
  54. let setIsDeleteRes = await signInTable.where({
  55. user_id:state.auth.uid,
  56. date:dbCmd.neq(date)
  57. }).update({isDelete:true})
  58. console.log({setIsDeleteRes});
  59. }
  60. //给加积分
  61. let score = n+days.length==14?60:10 //如果连续签到7天就多加50分,也就是60分
  62. balance += score
  63. let addScores = await scoresTable.add({
  64. user_id:state.auth.uid,
  65. balance,
  66. score,
  67. type:1,
  68. create_date:Date.now()
  69. })
  70. console.log({addScores});
  71. }
  72. return {...result,score:balance,signInData,n,days}
  73. }
  74. }
  75. function todayTimestamp(){
  76. //时区
  77. let timeZone = new Date().getTimezoneOffset()/60
  78. //获得相对于北京时间的时间戳
  79. let timestamp = Date.now()+3600*1000*(8+timeZone)
  80. //一天一共多少毫秒
  81. const D = 3600*24*1000
  82. //去掉余数,再减去东8区的8小时 得到当天凌晨的时间戳
  83. return parseInt(timestamp/D)*D - 3600*1000*8
  84. }