云开发小程序倒计时防刷新功能及签到功能

简介: 云开发小程序倒计时防刷新功能及签到功能
小程序倒计时防刷新功能

这是一个不美好的事情,我使用的是vant的倒计时,不管什么倒计时,刷新后倒计时就会重新开始。从晚上查到下班,从回家查到11点,结果没找到,没办法了自己写,结果10min写出来了,事实证明,我们需要相信自己。

签到加积分功能,小程序正在开发中,以后欢迎大家支持

效果图如下,发文不发图都是耍流氓

下面是完整代码

.wxml

<view class="outBox">
   <!-- 签到 -->
   <view class="qiandao">
      <view class="header">
         <text class="jfLabel">我 的 积 分</text>
         <view class="myjf">{{integral}}</view>
      </view>
      <view class="mainBody">
        <view class="top">签到领积分,3小时领一次</view>
        <view class="ljqd {{switchBtn == false ? 'noClick' : ''}}" bindtap="hClickSignin">
           <view class="qd" wx:if="{{switchBtn}}">签到</view>
           <view wx:else>
              <van-count-down bind:finish="finished" time="{{ time }}" />
           </view>
        </view>
      </view>
   </view>
</view>

.js

let canRoll = true,            // 加控制,防止用户点击两次
num = 1,                       // 用在动画上,让用户在第二次点击的时候可以接着上次转动的角度继续转
lotteryArrLen = 0,             // 放奖品的数组的长度
lottery = ['1积分', '5积分','15积分','25积分','100积分'];   // 放奖品
Page({
  data: {
    jifen: 0,             // 我的积分
    id: '',               // 该用户积分id
  },
  onLoad(opt) {
    this.setPlateData();                       // 执行设置转盘表面的文字
    let aniData = wx.createAnimation({        // 创建动画对象
      duration: 2000,
      timingFunction: 'ease'
    });
    this.aniData = aniData;                   // 将动画对象赋值给this的aniData属性
    this.getMyFen()
  },
  onShow(){
    this.getMyFen()
  },
  // 设置奖品数组
  setPlateData() {   
    lotteryArrLen = lottery.length;        // 获取奖品数组的长度,用来判断
    if (lotteryArrLen < 2) {        // 数组的奖品只有一个,扩展数组的长度到4
      let evenArr = new Array(4);        // 创建一个数组,方便操作。
      for (let i = 0; i < 4; i++) {
        if (i % 2 == 1) {        // 这里为什么要取1是为了在默认的界面将指针放在谢谢的地方,防止别人拿着中奖的截图来要奖品
          evenArr[i] = lottery[0];        // 将原数组的内容赋值到新的数组
        } else {
          evenArr[i] = '谢谢'        // 在数组中间隔插入谢谢
        }
      }
      lottery = [...evenArr];        // 将整合好的数组赋值给lottery数组
    } else {        // 数组中的奖品超过1个,则正常扩展数组,扩展的数组为原来的2倍
      let dataLen = 0;        // 用来放原来数组的索引
      let evenArr = new Array(lotteryArrLen * 2);        // 创建扩展数组
      for (let i = 0; i < (lotteryArrLen * 2); i++) {
        if (i % 2 == 1) {
          evenArr[i] = lottery[dataLen];        // 将原来数组的值赋值给新数组
          dataLen++;        // 原来数组的索引加一
        } else {
          evenArr[i] = '谢谢'
        }
      }
      lottery = [...evenArr];        // 将整合好的数组赋值给lottery数组
    }
    lotteryArrLen = lottery.length;        // 获取新的数组长度
    this.setData({
      lottery: lottery        // 设置好值,用于页面展示
    })
  },
  //  点击Go开始抽奖
  startRollTap() {   
    console.log(this.data.jifen);
    if (this.data.jifen < 5) {
      wx.showToast({
        title: '积分不足',
        icon: 'none'
      })
      return false
    }    
    if (canRoll) {
      canRoll = false;
      let aniData = this.aniData;        // 获取this对象上的动画对象
      let rightNum = ~~(Math.random() * lotteryArrLen);        // 生成随机数
      console.log(`随机数是${rightNum}`);
      console.log(`奖品是:${lottery[rightNum]}`);
      aniData.rotate(3600 * num - 360 / lotteryArrLen * rightNum).step();   
      this.setData({
        aniData: aniData.export()
      })
      num++;
      canRoll = true;
      // 中奖提示
      if(lottery[rightNum] == '谢谢'){
        // 点击一次减5积分
        var newJiFen = this.data.jifen - 5
        console.log(newJiFen);
        this.changeJiFen(newJiFen)
      } else {
        setTimeout(function () {
          //中奖
          wx.showModal({
            title: '提示',
            content: '恭喜您获得'+ lottery[rightNum],
            showCancel: false,
            success: function (res) {
              if (res.confirm) {
                //设置按钮可以点击
                // e.setData({
                //   btnconfirm: '/images/dianjichoujiang.png',
                //   clickLuck: 'clickLuck',
                // })
                // e.loadAnimation();
              }
            }
          })
        }, 3000);
        // 点击一次减5积分
        var newJiFen = this.data.jifen - 5
        console.log('减5后为:');
        console.log(newJiFen);
        // 中奖加积分
        console.log('中了');
        console.log(lottery[rightNum]);
        var str = lottery[rightNum]  // 抽到的积分
        str = parseInt(str.substring(0,str.length - 2)) // 去掉'积分'获得抽到的积分数值
        var newFen = newJiFen + str  // 原来积分加上抽到的积分
        console.log('最新');
        console.log(newFen);
        this.changeJiFen(newFen) // 将新积分保存到云数据库
      }
    }
    this.getMyFen()
  },
  // 从云数据库拿我的积分
  getMyFen(){
    wx.cloud.database().collection('jifen')
    .get()
    .then(res => {          
      if(res.data.length === 0) {
        this.addJiFen() // 添加0积分
      } else {
        // console.log(res);
        this.setData({
          jifen: res.data[0].jifen,
          id: res.data[0]._id
        })
      }
    }).catch(err => {
      console.log(err);
    })
  },
  changeJiFen(curFen){     // 抽奖更新积分
    console.log(curFen);
    console.log(this.data.id);
    wx.cloud.database().collection('jifen')
    .doc(this.data.id)
    .update({
      data: {
        jifen: curFen
      }
    }).then(res => {
      console.log('更新成功',res);
      this.getMyFen() // 重新获取数据
    }).catch(err => {
      console.log('更新失败',err);
    })
  },
  onHide(){
    lottery = ['1积分', '5积分','15积分','25积分','100积分'];  // 修复退出进入页面,转盘文案增加bug
  },
  onUnload(){
    lottery = ['1积分', '5积分','15积分','25积分','100积分'];  // 修复退出进入页面,转盘文案增加bug
  }
})

.wxss

.noClick {
  pointer-events: none;  /* 禁止鼠标点击 */
}
这个样式是修复这个bug的:
签到后切换为倒计时,点击倒计时那个圆形按钮,还是会触发事件,加积分。倒计时的时候添加这个样式,就会禁止点击事件。

样式有点儿垃圾,就不放了。说一下逻辑,点击签到,3小时后可以再次签到。点击签到,获取当前时间毫秒数,当前时间毫秒数加上自己设置的时间就是结束时间,给结束时间做缓存。然后自己封装一个函数noRefresh,不管什么时候刷新,从缓存拿到结束时间,用结束时间减去当前毫秒数,算出的时间间隔与自己设置的时间比较,如果小(注意不为负数)就说明还没到签到的时间,这个时候我们就把这个时间间隔赋值给data里的time,让倒计时接着跑。这里有个bug,就是在点击签到的时候,我又调用了一次onLoad,如果不调用的话,第一次倒计时时间正确,但是接下来的次数时间就变成原来一半了,原因是什么,我也懒得找了。大家有更好的方法可以dd我,我也是第一次写小程序。然后,没了,就是这样。

目录
相关文章
|
2月前
|
存储 小程序 Python
农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序
### 农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序 该程序通过`lunardate`库实现公历与农历的日期转换,支持闰月和跨年处理,用户输入农历节日名称后,可准确计算距离该节日还有多少天。功能包括农历节日查询、倒计时计算等。欢迎使用! (239字符)
201 86
|
9天前
|
小程序 前端开发 关系型数据库
基于Uniapp+php校园小程序,校园圈子论坛系统功能,校园跑腿二手交流功能设计
校园圈子论坛及综合服务平台集成了校园跑腿、兼职信息、外卖团购、闲置交换、租赁服务、表白墙等多功能模块,提供一站式校园生活解决方案。系统采用uniapp前端和PHP后端开发,支持多城市、多学校切换,配备分站式后台管理,确保稳定性和安全性。通过融云IM SDK实现即时通讯功能,增强用户互动与粘性。适用于大学校园、城市及社区圈子,满足多样化需求,提升便捷体验。
|
2月前
|
人工智能 小程序
【一步步开发AI运动小程序】十五、AI运动识别中,如何判断人体站位的远近?
【云智AI运动识别小程序插件】提供人体、运动及姿态检测的AI能力,无需后台支持,具有快速、体验好、易集成等特点。本文介绍如何利用插件判断人体与摄像头的远近,确保人体图像在帧内的比例适中,以优化识别效果。通过`whole`检测规则,分别实现人体过近和过远的判断,并给出相应示例代码。
|
8天前
|
小程序 前端开发 关系型数据库
uniapp跨平台框架,陪玩系统并发性能测试,小程序源码搭建开发解析
多功能一体游戏陪练、语音陪玩系统的开发涉及前期准备、技术选型、系统设计与开发及测试优化。首先,通过目标用户分析和竞品分析明确功能需求,如注册登录、预约匹配、实时语音等。技术选型上,前端采用Uni-app支持多端开发,后端选用PHP框架确保稳定性能,数据库使用MySQL保证数据一致性。系统设计阶段注重UI/UX设计和前后端开发,集成WebSocket实现语音聊天。最后,通过功能、性能和用户体验测试,确保系统的稳定性和用户满意度。
|
14天前
|
小程序 IDE PHP
圈子源码如何打包生成App小程序/开发一个圈子系统软件所需要的费用体现在哪里?
将PHP源码打包成App的过程涉及多个步骤和技术选择。以圈子源码为例,首先明确需求,确定App功能和目标用户群体,并根据需求开发小程序页面,如用户注册、圈子列表等。源码准备阶段确保源码适用于小程序开发,环境配置需安装IDE(如微信开发者工具)及依赖库。最后在IDE中打包小程序并上传至管理平台,通过审核后发布。费用方面,模板开发成本较低,定制开发则更高,具体取决于需求复杂度和第三方服务费用。
47 0
|
2月前
|
开发框架 小程序 前端开发
圈子社交app前端+后端源码,uniapp社交兴趣圈子开发,框架php圈子小程序安装搭建
本文介绍了圈子社交APP的源码获取、分析与定制,PHP实现的圈子框架设计及代码编写,以及圈子小程序的安装搭建。涵盖环境配置、数据库设计、前后端开发与接口对接等内容,确保平台的安全性、性能和功能完整性。通过详细指导,帮助开发者快速搭建稳定可靠的圈子社交平台。
|
12天前
|
移动开发 小程序
thinkphp+uniapp开发的多端商城系统源码/H5/小程序/APP支持DIY模板直播分销
thinkphp+uniapp开发的多端商城系统源码/H5/小程序/APP支持DIY模板直播分销
14 0
|
2月前
|
人工智能 小程序 UED
【一步步开发AI运动小程序】十六、AI运动识别中,如何判断人体站位?
【云智AI运动识别小程序插件】提供人体、运动及姿态检测的AI能力,本地引擎无需后台支持,具备快速、体验好、易集成等优势。本文介绍如何利用插件的`camera-view`功能,通过检测人体站位视角(前、后、左、右),确保运动时的最佳识别率和用户体验。代码示例展示了如何实现视角检查,确保用户正或背对摄像头,为后续运动检测打下基础。
|
2月前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十七、如何识别用户上传视频中的人体、运动、动作、姿态?
【云智AI运动识别小程序插件】提供人体、运动、姿态检测的AI能力,支持本地原生识别,无需后台服务,具有速度快、体验好、易集成等优点。本文介绍如何使用该插件实现用户上传视频的运动识别,包括视频解码抽帧和人体识别的实现方法。
|
3月前
|
人工智能 小程序 IDE
【一步步开发AI运动小程序】九、姿态辅助调试桌面工具的使用
随着AI技术的发展,各大厂商推出的AI运动APP如“乐动力”、“天天跳绳”等,使云上运动会、线上健身等概念大热。本文将指导你如何利用“云智AI运动识别小程序插件”,在微信小程序中实现类似功能,包括工具搭建、服务启动及数据回传等步骤,助力开发者高效开发AI运动小程序。
【一步步开发AI运动小程序】九、姿态辅助调试桌面工具的使用