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 相关文章推荐
xajax写的留言本
Nov 25 PHP
有关于PHP中常见数据类型的汇总分享
Jan 06 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
Sep 28 PHP
PHP比你想象的好得多
Nov 27 PHP
js+php实现静态页面实时调用用户登陆状态的方法
Jan 04 PHP
Symfony2创建基于域名的路由相关示例
Nov 14 PHP
php根据用户名和手机号查询是否存在手机号码
Feb 16 PHP
PHP创建单例后台进程的方法示例
May 23 PHP
阿里云的WindowsServer2016上部署php+apache
Jul 17 PHP
laravel 事件/监听器实例代码
Apr 12 PHP
基于laravel缓冲cache的用法详解
Oct 23 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 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对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
php面向对象基础详解【星际争霸游戏案例】
2020/01/23 PHP
javascript类继承机制的原理分析
2009/09/12 Javascript
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
JS滚轮事件onmousewheel使用介绍
2013/11/01 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
Javascript的&amp;&amp;和||的另类用法
2014/07/23 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
2014/09/09 Javascript
JavaScript中判断整字类型最简洁的实现方法
2014/11/08 Javascript
微信小程序 progress组件详解及实例代码
2016/10/25 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
2017/01/23 Javascript
Vue.js实战之组件的进阶
2017/04/04 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
vue自动化表单实例分析
2018/05/06 Javascript
Node对CommonJS的模块规范
2019/11/06 Javascript
JS实现移动端双指缩放和旋转方法
2019/12/13 Javascript
在vue中实现嵌套页面(iframe)
2020/07/30 Javascript
JavaScript位置参数实现原理及过程解析
2020/09/14 Javascript
[02:40]DOTA2英雄基础教程 炼金术士
2013/12/23 DOTA
[03:21]【TI9纪实】Old Boys
2019/08/23 DOTA
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
python3+PyQt5重新实现自定义数据拖放处理
2018/04/19 Python
pandas表连接 索引上的合并方法
2018/06/08 Python
python实现的分层随机抽样案例
2020/02/25 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
python访问hdfs的操作
2020/06/06 Python
python openCV自制绘画板
2020/10/27 Python
HTML5 canvas 基本语法
2009/08/26 HTML / CSS
Ramy Brook官网:美国现代女装品牌
2019/06/18 全球购物
一道输出判断型Java面试题
2014/10/01 面试题
求职信的七个关键技巧
2014/02/05 职场文书
反对四风自我剖析材料
2014/10/07 职场文书
房产分割协议书范文
2014/11/21 职场文书
党员评议自我评价
2015/03/03 职场文书
离婚案件原告代理词
2015/05/23 职场文书
2016高考感言
2015/08/01 职场文书