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正则走开
Mar 15 PHP
使用cookie实现统计访问者登陆次数
Jun 08 PHP
解析thinkphp基本配置 convention.php
Jun 18 PHP
PHP实现把数字ID转字母ID
Aug 12 PHP
php的declare控制符和ticks教程(附示例)
Mar 21 PHP
php分页示例分享
Apr 30 PHP
PHP中file_exists函数不支持中文名的解决方法
Jul 26 PHP
php实现图片文件与下载文件防盗链的方法
Nov 03 PHP
PHP 等比例缩放图片详解及实例代码
Sep 18 PHP
thinkPHP5.0框架独立配置与动态配置方法
Mar 17 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 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
一个简单的php实现的MySQL数据浏览器
2007/03/11 PHP
PHP 数组遍历foreach语法结构及实例
2016/06/13 PHP
php微信公众号开发之图片回复
2018/10/20 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
Javascript &amp; DHTML 实例编程(教程)基础知识
2007/06/02 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
JS获取时间的方法
2015/01/21 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
AngularJS入门教程之数据绑定原理详解
2016/11/02 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
2017/04/13 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
2017/06/22 Javascript
javascript高仿热血传奇游戏实现代码
2018/02/22 Javascript
在Django的模板中使用认证数据的方法
2015/07/23 Python
python rsa 加密解密
2017/03/20 Python
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
Python基于分水岭算法解决走迷宫游戏示例
2017/09/26 Python
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
python如何删除文件中重复的字段
2019/07/16 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
2019/10/11 Python
详解numpy.ndarray.reshape()函数的参数问题
2020/10/13 Python
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
美国最顶级的精品店之一:Hampden Clothing
2016/12/22 全球购物
斯德哥尔摩通票:Stockholm Pass
2018/01/09 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
介绍一下HTTP、HTTPS和SSL
2012/12/16 面试题
销售副总经理岗位职责
2013/12/11 职场文书
学校元旦晚会方案
2014/02/19 职场文书
刚毕业大学生自荐信范文
2014/02/20 职场文书
《美丽的公鸡》教学反思
2014/02/25 职场文书
销售员岗位职责
2014/06/09 职场文书
优秀学生主要事迹怎么写
2015/11/04 职场文书
学习商务礼仪心得体会
2016/01/22 职场文书
Python pandas求方差和标准差的方法实例
2021/08/04 Python