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 生成静态页面的办法与实现代码详细版
Feb 15 PHP
PHP获取表单textarea数据中的换行问题
Sep 10 PHP
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
May 18 PHP
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
Oct 03 PHP
php不允许用户提交空表单(php空值判断)
Nov 12 PHP
WordPress开发中短代码的实现及相关函数使用技巧
Jan 05 PHP
PHPCMS2008广告模板SQL注入漏洞修复
Oct 11 PHP
PHP设计模式之模板方法模式定义与用法详解
Apr 02 PHP
PHP单元测试框架PHPUnit用法详解
Jan 23 PHP
PHP生成随机码的思路与方法实例探索
Apr 11 PHP
laravel接管Dingo-api和默认的错误处理方式
Oct 25 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
Sep 15 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获取网络文件的实现代码
2010/01/01 PHP
PHP管理内存函数 memory_get_usage()使用介绍
2012/09/23 PHP
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
PHP代码重构方法漫谈
2018/04/17 PHP
PHP 爬取网页的主要方法
2018/07/13 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
2018/10/17 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
JavaScript 封装Ajax传递的数据代码
2009/06/05 Javascript
javascript中String类的subString()方法和slice()方法
2011/05/24 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
2015/04/15 Javascript
Nodejs学习item【入门手上】
2016/05/05 NodeJs
AngularJS实现Input格式化的方法
2016/11/07 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
React教程之Props验证的具体用法(Props Validation)
2017/09/04 Javascript
vue-cli3中vue.config.js配置教程详解
2019/05/29 Javascript
JS如何寻找数组中心索引过程解析
2020/06/01 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
HTML5对比HTML4的主要改变和改进总结
2016/05/27 HTML / CSS
Move Free官方海外旗舰店:美国骨关节健康专业品牌
2017/12/06 全球购物
sort命令的作用和用法
2013/08/25 面试题
护理实习自我鉴定
2013/12/14 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
爱情保证书
2015/01/17 职场文书
冬季作息时间调整通知
2015/04/24 职场文书
公司备用金管理制度
2015/08/04 职场文书
学者《孟子》名人名言
2019/08/09 职场文书