最近接到一个任务,是给一个线上的小程序添加一个签到的功能,具体功能包括:

1:按7天一轮显示时间

2:只计算连续签到天数,断签后自动归零

3:签到之后可以获得积分,连续签到前六天每天积分为1,六天之后每天积分为3

接到任务后,曾经尝试自己写界面,奈何道行太浅,都被领导否决了,无奈之下,便在网上找一些大神写的界面,最终找到一个还不错的,可惜没有后端,后来在大神同事的帮助下写了一个还算可以的后端功能,总算做出了草稿,具体代码如下,各位将就看一下。
前端(前端界面原创链接:https://blog.csdn.net/weixin_42211816/article/details/81985084)

wxml

<!--pages/signIn/signIn.wxml-->
<view class='signIn'><view class='sign-com'><view class='thead'><view class='tt'>您已连续签到</view><view class='mm'><label class='n'>{{signNum}}</label>天</view>  <view class='pp'>连续签到7日后每日得3分</view></view><view class='modle'><view class='mol'><view class='mol-line'></view><view class='mol-ites'><view class="ite {{signNum>=min?'hover':''}}" data-n='{{min}}'><label class='n'>+{{min<7?1:3}}</label>  <!-- 若签到天数小于7天,则每天签到得1积分,若大于或等于7天,则每天签到得3积分 --></view><view class="ite {{signNum>=min+1?'hover':''}}" data-n='{{min+1}}'><label class='n'>+{{min+1<7?1:3}}</label></view><view class="ite {{signNum>=min+2?'hover':''}}" data-n='{{min+2}}'><label class='n'>+{{min+2<7?1:3}}</label></view><view class="ite {{signNum>=min+3?'hover':''}}" data-n='{{min+3}}'><label class='n'>+{{min+3<7?1:3}}</label></view><view class="ite {{signNum>=min+4?'hover':''}}" data-n='{{min+4}}'><label class='n'>+{{min+4<7?1:3}}</label></view><view class="ite {{signNum>=min+5?'hover':''}}" data-n='{{min+5}}'><label class='n'>+{{min+5<7?1:3}}</label></view><view class="ite {{signNum>=min+6?'hover':''}}" data-n='{{max}}'><label class='n'>+{{min+6<7?1:3}}</label></view></view></view><view class='moday'><label class='dd'>{{min}}天</label><label class='dd'>{{min+1}}天</label><label class='dd'>{{min+2}}天</label><label class='dd'>{{min+3}}天</label><label class='dd'>{{min+4}}天</label><label class='dd'>{{min+5}}天</label><label class='dd'>{{min+6}}天</label></view></view><view class='the-btn'><button type='button' class='btn' bindtap='bindSignIn' data-num="{{signNum}}" disabled='{{signState}}'data-min="{{min}}" data-max="{{max}}" data-be="{{be}}">签到</button></view></view>
</view><view class='explax'><view class=''>日期开始:{{min}} </view><view class=''>日期结束:{{max}} </view><view class=''>签到数:{{signNum}}天</view><view class=''>切换周期的倍数:{{be}}</view>
</view>

wxss

/* pages/signIn/signIn.wxss */
.signIn{ width: 100%; height: auto;}.sign-com{ width: 100%; height: auto; padding: 0 30rpx; box-sizing: border-box; overflow: hidden; }
.sign-com .thead{ width: 100%; text-align: center; padding: 50rpx 0 35rpx;}
.sign-com .thead .tt{ font-size: 24rpx;}
.sign-com .thead .mm{ margin-top: 10rpx; font-size: 24rpx;}
.sign-com .thead .mm .n{ font-size: 66rpx; margin-right: 25rpx;}
.sign-com .thead .pp{ color: #999; font-size: 24rpx; margin-top: 10rpx;}.sign-com .modle{ width: 100%; height: 100rpx; margin-top: 10rpx; }
.sign-com .modle .mol{ width: 100%; height: 52rpx; position: relative;  }
.sign-com .mol-line{ width: 100%; height: 4rpx; background-color: #e6e6e6; position: absolute; left: 0; top: 50%; transform: translateY(-50%);}
.sign-com .mol-ites{ width: 100%; height: 100%;position: absolute;}
.mol-ites .ite{ width: 52rpx; height: 52rpx; border-radius: 50%; border: 1px solid #f5f5f5;background-color: #fff; box-sizing: border-box;  position: absolute; left: 0; top: 0; z-index: 2;}
.mol-ites .ite .n{ width: 44rpx; height: 44rpx; line-height: 44rpx; text-align: center; border-radius: 50%; background-color: #f5f5f5;position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); font-size: 22rpx;}
.mol-ites .ite::after{ content: ""; width: 80rpx; height: 4rpx; background-color: transparent;
position: absolute; left: 52rpx; top: 50%; margin-top: -2rpx; z-index: 2;}
.mol-ites .ite:last-of-type::after{ width: 0;}
.mol-ites .ite:nth-of-type(2){ left: 107rpx;}
.mol-ites .ite:nth-of-type(3){ left: 214rpx;}
.mol-ites .ite:nth-of-type(4){ left: 321rpx;}
.mol-ites .ite:nth-of-type(5){ left: 428rpx;}
.mol-ites .ite:nth-of-type(6){ left: 535rpx;}
.mol-ites .ite:nth-of-type(7){ left: 642rpx;}
.mol-ites .ite.hover{ border-color: #ff614a;}
.mol-ites .ite.hover .n{ background-color: #ff614a; color: #fff;}
.mol-ites .ite.hover::after{ background-color: #ff614a; }
.moday{ width: 100%; height:40rpx; overflow: hidden; position: relative; margin-top:20rpx;}
.moday .dd{ width: 52rpx; height: 40rpx; line-height: 1; text-align: center; font-size: 22rpx;position: absolute; left: 0; bottom: 0;}
.moday .dd:nth-of-type(2){ left: 107rpx;}
.moday .dd:nth-of-type(3){ left: 214rpx;}
.moday .dd:nth-of-type(4){ left: 321rpx;}
.moday .dd:nth-of-type(5){ left: 428rpx;}
.moday .dd:nth-of-type(6){ left: 535rpx;}
.moday .dd:nth-of-type(7){ left: 642rpx;}.the-btn{ margin: 50rpx 0;}
.the-btn .btn{ background-color: #ff614a; color: #fff;}
.the-btn.signed .btn{ background-color: rgba(153, 153, 153, 0.61); }.explax{ padding: 0 30rpx; font-size: 28rpx; color: #666;}

js

// pages/signIn/signIn.js
//获取应用实例
const app = getApp();Page({/*** 页面的初始数据*/data: {//img_url: config.imgUrl, //图片地址//签到模块signNum: 1,  //签到数 signState: false, //签到状态min: 1,  //默认值日期第一天1max: 7,  //默认值日期最后一天7be: 0,  //默认倍数},onLoad: function (options) {let _this = this;var a = wx.getStorageSync("userInfo");a ? this.setData({uInfo: a}) : wx.showModal({title: "提示",content: "您未登陆,请先登陆!",success: function (t) {if (t.confirm) {var a = encodeURIComponent("/sqtg_sun/pages/public/pages/myorder/myorder?id=0");app.reTo("/sqtg_sun/pages/home/login/login?id=" + a);} else t.cancel && app.lunchTo("/sqtg_sun/pages/home/index/index");}});//接收后端数据this.getSignInfo();},getSignInfo(){let that = this;app.ajax({url: "Signin|getSignInfo",data: {id:this.data.uInfo.id},success: function (res) {console.log('连接成功')that.setData({signNum: res.data.signNum,min: res.data.min //接收到的数据,页面调用的是这里的数据})},// fail: function (res) {//   console.log("连接失败")// }})},//签到bindSignIn(e) {var that = this,num = e.currentTarget.dataset.num;num++app.ajax({url: "Signin|sign",data: {id: this.data.uInfo.id},success: function (res) {that.setData({signNum: num,// signState: false //点击后是否继续允许点击,true为不允许,false为允许,正式使用时应为true})var min = e.currentTarget.dataset.min,max = e.currentTarget.dataset.max,be = e.currentTarget.dataset.be;if (num % 7 == 0) {be += 1;that.setData({be: be})}if (num == 7 * be + 1) {that.setData({min: 7 * be + 1,max: 7 * be + 7})}// wx.showToast({//   icon: 'success',//   title: res.msg,// })console.log('连接成功1')that.setData({// signNum: res.data,// min: res.data, //接收到的数据,页面调用的是这里的数据// signState: res.data//点击后是否继续允许点击,true为不允许,false为允许,正式使用时应为true})},// fail: function (res) {//   console.log("连接失败")// }})
},
})

后端(PHP,使用thinkphp框架)

<?phpnamespace app\api\controller;use app\base\controller\Api;
use app\model\User;
use think\Db;class Signin extends Api
{public function getSignInfo($id){//        此处的$id 等价于 $id=$_POST['id'];//php获取今日开始时间戳和结束时间戳$today_start = mktime(0, 0, 0, date('m'), date('d'), date('Y'));$today_end = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;//php获取昨日起始时间戳和结束时间戳$yesterday_start = mktime(0, 0, 0, date('m'), date('d') - 1, date('Y'));$yesterday_end = mktime(0, 0, 0, date('m'), date('d'), date('Y')) - 1;$user = User::get(['id' => $id]);//判断id是否存在//查询上一次签到时间$lastdata = Db::table('rs_signin')->where('ids', '=', $id)->where('time','>=',$yesterday_start)->where('time','<=',$yesterday_end)->find();if (!$lastdata) {$signNum = Db::table('rs_signin')->where('ids', '=', $id)->where('time','>=',strtotime(date('Y-m-d 00:00:00')))->count();}else{$signNum = Db::table('rs_signin')->where('ids', '=', $id)->where('time','>=',$user['firsttime'])->count();}if ($signNum<7){$min = 1;}elseif($signNum>=7){$min = $signNum-5;}success_json(['signNum'=>$signNum,'min'=>$min]);if ($lastdata >= $yesterday_start && $lastdata <= $yesterday_end) { //昨天有签到的情况//算出连续签到天数并输出值
//                    print_r($data);
//        return json($data); //thinkphp原先的发送信息的方法,这个版本被更改过,变成了下面的success_json()方法$dates = date('d', time()) - date('d', $data); //用今天的时间减去初始签到时间,得到中间相差的日数,即连续签到时间success_json($dates); //成功时的操作(输出连续签到天数),此方法相当于return,应放在最后执行} elseif ($lastdata < $yesterday_start) { //昨天没有签到的情况//                $counts = $integrals + 1;//修改初始签到时间$time = time(); //time值为今天签到时的时间戳$data = Db::table('rs_signin')->where('ids', '=', 82)->update(['time' => $time]);//thinkphp的查询}} //getSignInfo()方法结束//签到public function sign($id){//php获取今日开始时间戳和结束时间戳$today_start = mktime(0, 0, 0, date('m'), date('d'), date('Y'));$today_end = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;//php获取昨日起始时间戳和结束时间戳$yesterday_start = mktime(0, 0, 0, date('m'), date('d') - 1, date('Y'));$yesterday_end = mktime(0, 0, 0, date('m'), date('d'), date('Y')) - 1;$issign = Db::table('rs_signin')->where('ids', '=', $id)->where('time', '>=', $today_start)->where('time', '<=', $today_end)->find();//判断今天是否已签到过if ($issign) { //如果今天已经签到过,便阻止点击并终止操作$signs = User::where('id',$id)->column('sign');error_json('今日已签到');return;}$id_select = Db::table('rs_signin')->where('ids', '=', $id)->where('time', '>=', $yesterday_start)->where('time', '<=', $yesterday_end)->find();//判断昨天是否已签到过//查询积分$integrals = User::where('id', '=', $id)->find();$integrals = $integrals['integral'];
//        print_r($integrals);if ($id_select) { //如果昨天已经签到过,便算出今天签到之后与初始签到日之间的日数差,即连续签到天数$member = User::where('id', '=', $id)->find();//            $dates = date('d', time()) - date('d', $data); //用今天的时间减去初始签到时间,得到中间相差的日数,即连续签到时间$diff = date_diff((new \DateTime(date('Y-m-d 00:00:00',$member['firsttime']))), (new \DateTime(date('Y-m-d 00:00:00'))));$day = $diff->days;if ($day+1 >= 7) {$integral_count = 3;} else {$integral_count = 1;}$counts = $integrals + $integral_count;Db::table('rs_signin')->insert(['ids' => $id, 'time' => time(), 'integral' => $integral_count]);User::update(['integral' => $counts],['id'=>$id]);//            print_r($day);} else { //如果昨天没签到过,便更改user表中firsttime字段的值,并新增一条记录进rs_signin表中
//            print_r('----');$counts = $integrals + 1;User::update(['firsttime' => strtotime(date('Y-m-d 00:00:00')),'integral'=>$counts],['id'=>$id]);Db::table('rs_signin')->insert(['ids' => $id, 'time' => time(), 'integral' => 1]);}}}//类结束

最终效果如下:

微信小程序签到功能实现相关推荐

  1. python 微信小程序签到系统_微信小程序签到功能

    本文实例为大家分享了简易微信小程序签到功能的具体代码,供大家参考,具体内容如下 一.效果图 点击签到后 二.数据库 用一张数据表存用户签到的信息,每次用户签到都会往表中添加一条记录了用户id和签到日期 ...

  2. 简易微信小程序签到功能

    一.效果图 点击签到后 二.数据库 用一张数据表存用户签到的信息,每次用户签到都会往表中添加一条记录了用户id和签到日期的数据,如下图 三.后端 后端写两个接口,一个用于查询用户今日是否签到和签到记录 ...

  3. 微信小程序php签到功能,简易微信小程序签到功能

    一.效果图 (此图片来源于网络,如有侵权,请联系删除! ) 点击签到后 (此图片来源于网络,如有侵权,请联系删除! ) 二.数据库 用一张数据表存用户签到的信息,每次用户签到都会往表中添加一条记录了用 ...

  4. 微信小程序插件功能页开发详细流程

     有问题可以扫码加我微信,有偿解决问题.承接小程序开发. 微信小程序开发交流qq群   173683895  . 526474645 : 正文: 关于新出的微信小程序插件功能页做一下记录,希望能帮到大 ...

  5. 微信小程序php后台支付,微信小程序 支付功能实现PHP实例详解

    微信小程序 支付功能实现PHP实例详解 前端代码: wx.request({ url: 'https://www.yourhost.com/weixin/WeiActivity/payJoinfee' ...

  6. 微信 php收藏功能实现,关于微信小程序收藏功能的实现

    这篇文章主要介绍了微信小程序收藏功能的实现代码,基本功能是点击收藏后显示已收藏,在另一个页面出现目前点击收藏的项目.需要的朋友可以参考下 需求 点击收藏后显示已收藏,在另一个页面出现目前点击收藏的项目 ...

  7. python个人微信支付接口_Python实现微信小程序支付功能

    正文 由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程.当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程. 1.支付交互流程 2.获取openid( ...

  8. vc++6.0获取磁盘基本信息_微信小程序——常用功能2:微信小程序用户登录,申请用户授权并获取用户基本信息...

    微信小程序--常用功能2:申请用户授权并获取用户基本信息 为了更好的用户体验,很多时候我们想要获取用户的基本信息,从而实现将信息呈现到用户界面.给用户划分地域.给用户分类等功能. 但是要想获取用户信息 ...

  9. python微信小程序抢购_Python实现微信小程序支付功能!Python确实强的一批!

    正文 由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程.当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程. 1.支付交互流程 2.获取openid( ...

  10. 微信小程序支付功能用服务器吗,微信小程序 支付功能 服务器端(TP5.1)实现...

    首先下载微信支付SDK ,将整个目录的文件放在 /application/extend/WxPay 目录下 在使用SDK之前我们需要对 WxPay.Config.php 进行配置 namespace ...

最新文章

  1. 潜移默化学会WPF(绚丽篇)--热烈欢迎RadioButton,改造成功,改造成ImageButton,新版导航 - AYUI框架 - 博客园...
  2. linux端口映射_Linux 系统安全与优化配置
  3. WebService学习总结(二)——WebService相关概念介绍
  4. mysql的limit_MYSQL中LIMIT用法
  5. Easy-mock让团队协作效率提高不止一点点
  6. JAVA线程并发数量控制_Java并发工具类(三):控制并发线程数的Semaphore
  7. 红帽RHEL8和RHEL7有什么区别?
  8. HDU1234 开门人和关门人(解法二)【废除!!!】
  9. 使用树莓派3获取CPU温度
  10. 如何使用QXDM 的1477项 转化utc时间
  11. NanoHTTPD 获取请求ip
  12. 【2022省选模拟】星际航道——网格图最小生成树、LCT
  13. 我的世界java雪村种子_我的世界:自带雪屋前哨站与要塞的富有雪村种子,超稀有砂砾山...
  14. Increasing Triplet Subsequence
  15. mac 解决sudo: no valid sudoers sources found, quitting
  16. VBA - 粘贴为数值型
  17. 在 Jupyter Notebook 中使用R语言
  18. 笑看云卷云舒,聆听花开花落
  19. 联想yoga14s和小新pro14哪个好
  20. 币圈指数哪家强?且看分析OK VS 火币

热门文章

  1. win10 家庭版升级win11
  2. android xml 设置半透明
  3. 专利交底书怎么写 -
  4. 如何为java添加日历控件_laydate日历控件使用方法详解
  5. 广播前置放大器的作用_IP网络广播前置放大器
  6. 微信小程序中,数字等宽字体
  7. xmlspy xmlviewer
  8. 人员基础信息一体化采集设备
  9. Postman下载安装
  10. unity技美31——Curvy Splines寻路插件绘制赛道,并且生成OBJ教程