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新手用的Insert和Update语句构造类
Mar 31 PHP
php获取URL中带#号等特殊符号参数的解决方法
Sep 02 PHP
dedecms集成财付通支付接口
Dec 28 PHP
PHP中is_file()函数使用指南
May 08 PHP
1亿条数据如何分表100张到Mysql数据库中(PHP)
Jul 29 PHP
Symfony2之session与cookie用法小结
Mar 18 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
May 29 PHP
iis 7下安装laravel 5.4环境的方法教程
Jun 14 PHP
PHP实现QQ登录的开原理和实现过程
Feb 04 PHP
php处理抢购类功能的高并发请求
Feb 08 PHP
一文看懂PHP进程管理器php-fpm
Jun 01 PHP
如何利用PHP实现上传图片功能详解
Sep 24 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
晶体管单管来复再生式收音机
2021/03/02 无线电
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
2017/07/04 PHP
PHP使用SMTP邮件服务器发送邮件示例
2018/08/28 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
Javascript的getYear、getFullYear、getUTCFullYear异同分享
2011/11/30 Javascript
Javascript new Date().valueOf()的作用与时间戳由来详解
2013/04/24 Javascript
ie与ff下的event事件使用介绍
2013/11/25 Javascript
jquery validate 自定义验证方法介绍 日期验证
2014/02/27 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
jQuery简单注册和禁用全局事件的方法
2016/07/25 Javascript
js判断请求的url是否可访问,支持跨域判断的实现方法
2016/09/17 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
JavaScript递归算法生成树形菜单
2017/08/15 Javascript
JavaScript中var的重要性实例分析
2019/07/09 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
python 字符串格式化代码
2013/03/17 Python
Python中使用支持向量机(SVM)算法
2017/12/26 Python
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
python Pexpect 实现输密码 scp 拷贝的方法
2019/01/03 Python
python tkinter图形界面代码统计工具
2019/09/18 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
初中生三年学习生活的自我评价
2013/11/03 职场文书
生物技术研究生自荐信
2013/11/12 职场文书
交通事故协议书
2014/04/15 职场文书
小学生手册家长评语
2014/04/16 职场文书
超级礼物观后感
2015/06/15 职场文书
创业计划书之闲置物品置换中心
2019/12/25 职场文书
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python
Python函数式编程中itertools模块详解
2021/09/15 Python
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python