index.js 2.3 KB

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