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 相关文章推荐
简单的用PHP编写的导航条程序
Oct 09 PHP
PHP中include()与require()的区别说明
Mar 10 PHP
php生成随机密码的三种方法小结
Sep 04 PHP
PHP中的cookie不用刷新就生效的方法
Feb 04 PHP
深入PHP内存相关的功能特性详解
Jun 08 PHP
PHP页面中文乱码分析
Oct 29 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
Jun 30 PHP
学习php设计模式 php实现观察者模式(Observer)
Dec 09 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
Mar 22 PHP
Yii全局函数用法示例
Jan 22 PHP
ThinkPHP实现图片上传操作的方法详解
May 08 PHP
laravel 解决后端无法获取到前端Post过来的值问题
Oct 22 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
PHP运行时强制显示出错信息的代码
2011/04/20 PHP
php实现读取超大文件的方法
2014/07/28 PHP
php微信公众开发之获取周边酒店信息的方法
2014/12/22 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
JavaScript实现Sleep函数的代码
2007/03/04 Javascript
javascript 触发事件列表 比较不错
2009/09/03 Javascript
JS验证身份证有效性示例
2013/10/11 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
2014/10/21 Javascript
JavaScript中用字面量创建对象介绍
2014/12/31 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
Node.js巧妙实现Web应用代码热更新
2015/10/22 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
深入讲解xhr(XMLHttpRequest)/jsonp请求之abort
2017/07/26 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
JavaScript数组push方法使用注意事项
2017/10/30 Javascript
Javascript如何递归遍历本地文件夹
2020/08/06 Javascript
利用Python绘制MySQL数据图实现数据可视化
2015/03/30 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
Python编程实现删除VC临时文件及Debug目录的方法
2017/03/22 Python
centos6.4下python3.6.1安装教程
2017/07/21 Python
Python深度优先算法生成迷宫
2018/01/22 Python
python递归函数绘制分形树的方法
2018/06/22 Python
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
django最快程序开发流程详解
2019/07/19 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
Python实现i人事自动打卡的示例代码
2020/01/09 Python
班会关于环保演讲稿
2013/12/29 职场文书
社区党务公开实施方案
2014/03/18 职场文书