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版(4)
Oct 09 PHP
php simplexmlElement操作xml的命名空间实现代码
Jan 04 PHP
php中3des加密代码(完全与.net中的兼容)
Aug 02 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
Dec 18 PHP
XHProf报告字段含义的解析
May 17 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
PHP自定义函数实现格式化秒的方法
Sep 14 PHP
PHP在linux上执行外部命令的方法
Feb 06 PHP
yii2使用gridView实现下拉列表筛选数据
Apr 10 PHP
PHP+jQuery实现双击修改table表格功能示例
Feb 21 PHP
laravel多条件查询方法(and,or嵌套查询)
Oct 09 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
Dec 31 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数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
探讨PHP JSON中文乱码的解决方法详解
2013/06/06 PHP
深入PHP curl参数的详解
2013/06/17 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
初学JavaScript第二章
2008/09/30 Javascript
jQuery 操作下拉列表框实现代码
2010/02/22 Javascript
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
JQuery中使用Ajax赋值给全局变量失败异常的解决方法
2014/08/18 Javascript
JavaScript实现文字与图片拖拽效果的方法
2015/02/16 Javascript
js实现不提交表单获取单选按钮值的方法
2015/08/21 Javascript
JavaScript实现同时调用多个函数的方法
2015/11/09 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
jQuery根据name属性进行查找的用法分析
2016/06/23 Javascript
基于Javascript实现文件实时加载进度的方法
2016/10/12 Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
2016/10/27 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
Bootstrap table右键功能实现方法
2017/02/20 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
vue axios用法教程详解
2017/07/23 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
JavaScript动态创建二维数组的方法示例
2019/02/01 Javascript
js实现前端界面导航栏下拉列表
2020/08/27 Javascript
Python urllib模块urlopen()与urlretrieve()详解
2013/11/01 Python
python爬虫之模拟登陆csdn的实例代码
2018/05/18 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
利用Python小工具实现3秒钟将视频转换为音频
2019/10/29 Python
Java程序开发中如何应用线程
2016/03/03 面试题
夜大毕业自我鉴定
2013/10/11 职场文书
高校辅导员推荐信范文
2013/12/25 职场文书
英语国培研修感言
2014/02/13 职场文书
思品教学工作总结
2015/08/10 职场文书
2019朋友新婚祝福语精选
2019/10/10 职场文书
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL