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获取服务器信息的实现代码
Feb 04 PHP
完美解决PHP中的Cannot modify header information 问题
Aug 12 PHP
php实现的zip文件内容比较类
Sep 24 PHP
php获取根域名方法汇总
Oct 28 PHP
8个PHP数组面试题
Jun 23 PHP
Laravel中Trait的用法实例详解
Mar 16 PHP
Symfony模板的快捷变量用法实例
Mar 17 PHP
php简单实现多语言切换的方法
May 09 PHP
php封装的smartyBC类完整实例
Oct 19 PHP
Laravel中log无法写入问题的解决
Jun 17 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
Jan 23 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
深入了解php4(2)--重访过去
2006/10/09 PHP
对Session和Cookie的区分与解释
2007/03/16 PHP
php mysql索引问题
2008/06/07 PHP
PHP IE中下载附件问题解决方法
2014/01/07 PHP
php的memcache类分享(memcache队列)
2014/03/26 PHP
利用php做服务器和web前端的界面进行交互
2016/10/31 PHP
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
jquery定时滑出可最小化的底部提示层特效代码
2013/10/02 Javascript
利用js判断浏览器类型(是否为IE,Firefox,Opera浏览器)
2013/11/22 Javascript
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
js禁止页面刷新与后退的方法
2015/06/08 Javascript
使用JQuery实现Ctrl+Enter提交表单的方法
2015/10/22 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
JavaScript中this的用法实例分析
2016/12/19 Javascript
node.js基础知识小结
2018/02/26 Javascript
mockjs+vue页面直接展示数据的方法
2018/12/19 Javascript
使用Vue CLI创建typescript项目的方法
2019/08/09 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
彻底搞懂Python字符编码
2018/01/23 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
2018/08/10 Python
django mysql数据库及图片上传接口详解
2019/07/18 Python
python类中super() 的使用解析
2019/12/19 Python
python操作yaml说明
2020/04/08 Python
物流专业大学生求职信范文
2013/10/28 职场文书
生产部岗位职责范文
2014/02/07 职场文书
乡镇信息公开实施方案
2014/03/23 职场文书
美术专业自荐信
2014/07/07 职场文书
学校运动会广播稿100条
2014/09/14 职场文书
乡镇机关党员民主评议表自我评价
2014/09/21 职场文书
大学学生个人总结
2015/02/15 职场文书
写给纪委的违纪检讨书
2015/05/05 职场文书
Python基础之常用库常用方法整理
2021/04/30 Python
JavaScript流程控制(循环)
2021/12/06 Javascript