TP5框架实现签到功能的方法分析


Posted in PHP onApril 05, 2020

本文实例讲述了TP5框架实现签到功能的方法。分享给大家供大家参考,具体如下:

基于tp5 模型的一个签到功能;

由于存储所有的签到日期数据库会非常庞大,所以签到日期只存储近三个月的。

具体功能:

1、记录最近一次的签到时间

2、每次签到都会添加15积分

3、有连续签到的记录

CREATE TABLE `sp_sign` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
 `times` datetime DEFAULT NULL COMMENT '最近一次签到时间',
 `userid` int(11) DEFAULT NULL COMMENT '用户id',
 `days` tinyint(6) NOT NULL DEFAULT '0' COMMENT '连续签到的天数',
 `number` decimal(10,0) NOT NULL DEFAULT '0' COMMENT '当月签到给的积分',
 `one` varchar(255) DEFAULT NULL COMMENT '当月签到的日期,用“,”隔开',
 `two` varchar(255) DEFAULT NULL COMMENT '上个月签到的日期,用“,”隔开',
 `three` varchar(255) DEFAULT NULL COMMENT '上上个月签到的日期,用“,”隔开',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
/**
   * 用户签到
   * @param array $userid 用户id
   */
  public function add($userid)
  {
      $data = Db::name('sign')->where('userid',$userid)->select();
      if(count($data) == 0) //没有该用户的签到记录
      {
        $query4 = Db::name('sign')->insert(['times'=>date('Y-m-d H:i:s'),'userid'=>$userid,'days'=>1,'number'=>'15','one'=>date('d',time())]);
        return 1;
      }
      else
      {
        //判断今天是否签到
        $todayBegin=date('Y-m-d'." 00:00:00");
        $todayEnd= date('Y-m-d'." 23:59:59");
        $isexit = Db::name('sign')->field('times')->where(['userid'=>$userid])->where('times','between',[$todayBegin,$todayEnd])->select();
        if(count($isexit) == 1)  //今日已签到
        {
          return 0;
        }
        else  //今日未签到
        {
          $times = Db::name('sign')->where('userid',$userid)->field('times')->select();
          $time = strtotime($times[0]['times']);
 
          if((time()-$time > 24*60*60))    //上次签到时间大于24小时,连续签到天数清零
          {
            $query = Db::name('sign')->where('userid',$userid)->update(['days'=>1]);
          }
          else   //上次签到时间小于24小时,连续签到次数加1
          {
            $query = Db::name('sign')->where('userid',$userid)->setInc('days');
          }
          //更新上次签到时间和签到积分
          $query1 = Db::name('sign')->where('userid',$userid)->update(['times'=>date('Y-m-d H:i:s')]);
          $query2 = Db::name('sign')->where('userid',$userid)->setInc('number', 15);
 
          $sqldate = date('m',$time);  //上次签到日期的月份
          $nowdate = date('m',time()); //当前月份
          //记录本次签到日期
          if($sqldate != $nowdate) //上次签到日期与本次签到日期月份不一样
          {
            $oldtime = $times[0]['times'];
            $onetime=date("Y-m-d H:i:s", strtotime("-1 month")); //获取前1个月的时间,获取格式为2016-12-30 13:26:13
            $twotime=date("Y-m-d H:i:s", strtotime("-2 month")); //获取前2个月的时间
            $threetime=date("Y-m-d H:i:s", strtotime("-3 month")); //获取前3个月的时间
 
            $rs = Db::name('sign')->where('userid',$userid)->field('one,two,three')->select();
 
            if($oldtime < $onetime && $oldtime >= $twotime)   //月份间隔 大于1个月,小于2个月
            {
              $one = date('d',time());
              $two = $rs[0]['one'];
              $three = $rs[0]['two'];
            }
            elseif($oldtime < $twotime && $oldtime >= $threetime) //月份间隔 大于2个月,小于3个月
            {
              $one = date('d',time());
              $two = '';
              $three = $rs[0]['one'];
            }
            elseif($oldtime < $threetime) //月份间隔 大于3个月
            {
              $one = date('d',time());
              $two = '';
              $three = '';
            }
            $query3 = Db::name('sign')->where('userid',$userid)->update(['one'=>$one,'two'=>$two,'three'=>$three]);
          }
          else //上次签到日期与本次签到日期月份一样
          {
            $one = Db::name('sign')->where('userid',$userid)->field('one')->select();
            $arr[] = $one[0]['one'];
            $arr[] = date('d',time());
            $newones = implode(",",$arr);
            $query3 = Db::name('sign')->where('userid',$userid)->update(['one'=>$newones]);
          }
        return 1;
        }
      }
  }

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
mysql时区问题
Mar 26 PHP
php5.3 废弃函数小结
May 16 PHP
深入php数据采集的详解
Jun 02 PHP
20个2014年最优秀的PHP框架回顾
Oct 22 PHP
PHP中使用php://input处理相同name值的表单数据
Feb 03 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
Mar 03 PHP
PHP准确取得服务器IP地址的方法
Jun 02 PHP
PHP5.6读写excel表格文件操作示例
Feb 26 PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
May 31 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
May 02 PHP
phpcmsv9.0任意文件上传漏洞解析
Oct 20 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
Mar 09 PHP
TP5框架页面跳转样式操作示例
Apr 05 #PHP
TP5框架实现的数据库备份功能示例
Apr 05 #PHP
TP5框架实现一次选择多张图片并预览的方法示例
Apr 04 #PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 #PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
Apr 04 #PHP
thinkphp框架表单数组实现图片批量上传功能示例
Apr 04 #PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
Apr 04 #PHP
You might like
Youku 视频绝对地址获取的方法详解
2013/06/26 PHP
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
JavaScript 对象模型 执行模型
2009/12/06 Javascript
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
jQuery创建插件的代码分析
2011/04/14 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
2015/06/18 Javascript
js实现类似MSN提示的页面效果代码分享
2015/08/24 Javascript
深入探讨前端框架react
2015/12/09 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
2017/03/09 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
2018/03/02 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
Javascript ParentNode和ChildNode接口原理解析
2020/03/16 Javascript
vue 封装 Adminlte3组件的实现
2020/03/18 Javascript
js实现淘宝浏览商品放大镜功能
2020/10/28 Javascript
[48:48]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Dream TIME
2014/05/21 DOTA
python利用高阶函数实现剪枝函数
2018/03/20 Python
Python设计模式之桥接模式原理与用法实例分析
2019/01/10 Python
Python根据成绩分析系统浅析
2019/02/11 Python
Python常用的json标准库
2019/02/19 Python
python读取目录下所有的jpg文件,并显示第一张图片的示例
2019/06/13 Python
python tkinter基本属性详解
2019/09/16 Python
Python decorator拦截器代码实例解析
2020/04/04 Python
python新手学习可变和不可变对象
2020/06/11 Python
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
服务中心夜班服务员岗位职责
2013/11/27 职场文书
个人收入证明范本
2014/01/12 职场文书
文体活动总结范文
2014/05/05 职场文书
第二课堂活动总结
2014/05/07 职场文书
小学生法制教育心得体会
2016/01/14 职场文书
学生会2016感恩节活动小结
2016/04/01 职场文书
Pytorch GPU内存占用很高,但是利用率很低如何解决
2021/06/01 Python